Lesson9 アプリの起動とレジストリ
WScriptのオブジェクト1 -WshShellオブジェクト-

 さあ、いよいよ応用編のはじまりです。応用編では、基礎編の知識を前提として、WSHをより有効に使いこなすために、さまざまなオブジェクトを取り上げていきたいと思います。(オブジェクト・メソッド・プロパティの意味があやふやな方は、Lesson2で復習を…)

 Lesson9で取り上げるのは、WScriptオブジェクトの一つ、WshShellオブジェクトです。Wscriptオブジェクトについては、既にLesson2で述べました。WScriptオブジェクトは、面倒なコードを書かずとも、Wscript.Path のようにコード中からすぐプロパティやメソッドを呼び出すことができましたが、今回登場する、WshShellオブジェクトは、このようにワンステップで記述することはできません。

 WshShellオブジェクトの機能を利用するには、まず、VBSのCreateObject関数、あるいはWScriptオブジェクトのCreateObjectメソッドを用いて、WshShellオブジェクトを作成し、そのオブジェクトをオブジェクト変数に代入する必要があります。下のコードをご覧ください。

Dim WSHShell
Set WSHShell = WScript.CreateObject("WScript.Shell")

 1行目で、WSHShellという名前のオブジェクト型の変数を宣言しています。(変数名は自由につけてOKです。変数命名規則に従えば、objWSHShellと書くのがいいのかも)

 2行目では、まず右辺に注目すると、WScriptオブジェクトのCreateObjectメソッドを記述しています。CreateObjectメソッドは、引数に指定したオブジェクトを返します。引数には、

"オブジェクトを提供しているアプリケーションの名前.作成するオブジェクトの種類" 

のような文字列を指定しますが、あまり深く考えずに覚えてしまうくらいでも問題ないでしょう。

 次に左辺ですが、Setステートメントを使って、右辺のオブジェクトを、WSHShellという変数に代入しています。通常の値の代入は=だけでいいのですが、このようにオブジェクトを代入するときは、Setステートメントを使うという決まりがあります。

 なお、CreateObject関数を使う場合は、下のようになります。

Dim WSHShell
Set WSHShell = CreateObject("WScript.Shell")

 CreateObjectメソッドと、CreateObject関数の違いは、標準的なオブジェクトを利用する場合は、ないといって差し支えないでしょう。お好きな方をどうぞ。

 このようにして、WSHShellには、WshShellオブジェクトが代入されました。以降、WshShellオブジェクトのプロパティ・メソッドは、WSHShellから呼び出せます。

 

 それではまず、WSHShellを使ってアプリケーションを起動するスクリプトを書いてみましょう。 

Dim WSHShell
Set WSHShell = WScript.CreateObject("WScript.Shell")
WSHShell.Run "notepad.exe" 'メモ帳を起動します。
MsgBox "メモ帳を起動しました。"
WSHShell.Run "C:\Windows\tips.txt",3,True 'Tips.txtを関連づけに従って最大化表示
WSHShell.Run "C:\WINDOWS\SNDREC32.EXE /play /close C:\WINDOWS\MEDIA\The Microsoft Sound.wav",0,True
'サウンドレコーダーで、The Microsoft Sound.wavを再生する。ウィンドウは表示しない
WSHShell.Run "notepad.exe " & Wscript.ScriptFullName,1,True '実行したスクリプト自体をメモ帳で表示
WSHShell.Popup "実験終わり",3,"ポップアップメッセージ",vbInformation

 このようにRunメソッドを使うと、アプリケーションを起動することができます。
 第一引数に開くファイルを指定します。実行ファイルを指定することもできますし、ファイルを指定すると、関連づけに従ってそのファイルを開いてくれます。また、パスの通っているディレクトリにあるファイルは、ファイル名だけ指定すれば開くことができます。
 第二引数にはウィンドウのスタイルを指定します。省略時は1(通常サイズ)です。0にすると非表示、2だと最小化、3だと最大化の状態で開きます。他にも指定できるスタイルがありますが、ここを参照してください。
 第三引数にはRunメソッドで起動したアプリの終了を待つかどうかを指定します。Trueだと終了するまで次の行に制御を移さない、Falseだと起動と同時に次の行に制御を移します。省略するとFalseになります。

 上のスクリプトの最後の行で、Popupメソッドでメッセージを表示しています。このメソッドはMsgBox関数とは違い、第二引数で指定した秒数を経過すると、自動的にダイアログが閉じるという特長を持っています。このメソッドについても詳しくはここをご覧ください。

 さて、Runメソッドのちょっと変わった利用法を紹介しましょう。まずは下のスクリプトをコピーして適当なファイル名で保存してください。

Dim WSHShell,intErrCode
Set WSHShell = WScript.CreateObject("WScript.Shell")
intErrCode=WSHShell.Run("a.vbs",1,True)

Select Case intErrCode
	Case -1 MsgBox "ダイアログは自動的に閉じられました。"
	Case vbYes MsgBox "「はい」を押しました。"
	Case vbNo MsgBox "「いいえ」を押しました。"
	Case vbCancel MsgBox "「キャンセル」を押しました。"
End Select

 次に、上のスクリプトと同じフォルダに、下のスクリプトをa.vbsという名前で保存してください。

Dim WSHShell,intMsg
Set WSHShell = WScript.CreateObject("WScript.Shell")
intMsg=WSHSHell.Popup("どれか押してください",2,,vbYesNoCancel)
Wscript.Quit intMsg

 できたらおもむろに、一つ目のスクリプトを実行してみてください。
 このスクリプトを実行すると、まず、Runメソッドで、a.vbsが実行されます。Trueを指定しているので、一つ目のスクリプトの実行はひとまず停止します。
 次にRunメソッドで呼び出されたa.vbsでは、Popupメソッドの返値がintMsgという変数に代入されます。
 そして、intMsgはWscript.Quitメソッドの引数として読み込まれ、ここでa.vbsは終了します。
 a.vbsは終了したので、一つ目のスクリプトの実行が再開されます。ここで、RunメソッドでTrueを指定した場合、実行したファイルのエラーコードを返すので、intErrCodeという変数に、a.vbsのエラーコード、すなわち先ほどのintMsgという値が代入されます。
 そしてintErrCodeの値をSelect Caseステートメントで判別します。なお、Popupメソッドで指定時間を経過し、自動的にダイアログが閉じられた場合は、-1という値を返します

 このように、RunメソッドとQuitメソッドを用いると、別のスクリプトの結果を利用することができます。(ただし整数値に限りますが…)
 同じスクリプトを複数のファイルから利用するときに便利、かも、しれません。
 Lesson12で述べる予定の、WshArgumentsオブジェクト(コマンドラインオプションの値を格納)を併用すれば、元のスクリプトからある値を指定して、別のスクリプトでその値を元に実行し、その結果を元のスクリプトに返すという、「一つのファイルをFunctionプロシージャにしたような」動作が可能になります。

 

 お遊びはこれくらいにして(^^;、次にWSHShellを使ってレジストリにアクセスする方法を述べます。

'登録情報変更スクリプト
Dim WSHShell
Set WSHShell=Wscript.CreateObject("Wscript.Shell")
Call RegChange ("HKLM\Software\Microsoft\Windows\CurrentVersion\RegisteredOwner","ユーザー名を入力してください")
Call RegChange ("HKLM\Software\Microsoft\Windows\CurrentVersion\RegisteredOrganization","会社名を入力してください")

Sub RegChange(strName,strMsg)
	Dim Value
	Value=InputBox (strMsg,"登録変更",WSHShell.RegRead (strName))
	If Value<>"" Then
		WSHShell.RegWrite strName,Value,"REG_SZ"
	End If
End Sub

 これは既に公開している登録情報変更スクリプトです。今回はこれを題材にRegReadメソッドRegWriteメソッドの説明をしましょう。
 と、その前にお約束の一言。このスクリプトはレジストリを書き換えます。ご使用はご自分の責任においてお願いします。

 このスクリプトでは、RegChangeプロシージャに「レジストリの値の名前」と、「表示するメッセージの内容」を引数として与えると、現在の値を表示し、値を変更させるためのInputBoxを表示させるようになっています。

 では、RegChangeプロシージャを見ていきましょう。
 まず、RegReadメソッドで、strNameに指定したレジストリの値の名前を取得しています。RegReadメソッドは、引数にレジストリのキーや名前を指定すると、その値を返します。ここでは、最初にHKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\RegisteredOwnerという名前の値を読み込んでいます。これはWin98インストール時に指定したユーザー名(システムのプロパティでも確認できます)が格納されているところです。HKEY_LOCAL_MACHINEは、HKLMのように書き換える決まりがあるのでお間違いのないよう。
 この値を、InputBox関数の第三引数として指定することで、現在のユーザー名をデフォルトの文字列としてテキストボックスに表示させます。

 次に、ユーザーがInputBoxに入力した新しい使用者名を、レジストリに書き込むため、RegWriteメソッドを使用しています。RegWriteメソッドは、第一引数に対象とするキーや名前を指定し、第二引数にそこに書き込む値を指定し、第三引数に書き込む値のタイプを指定します。タイプは省略可で、省略すると"REG_SZ"(文字列)になります。
 ここではstrNameの名前の項目に、ユーザーが入力したValueという値を文字列としてレジストリに書き込んでいます。
 なお、ユーザーがキャンセルボタンを押したり、何も入力しなかった場合は変更を加えません。

 strNameに〜\RegisteredOrganizationを指定することで、同様に会社名も変更します。

 指定できるタイプは他にREG_DWORD (DWORD値) REG_BINARY (バイナリ)があります。詳しくはここをご覧ください。

 

 最後にRegDeleteメソッドの例をご覧ください。

On Error Resume Next
Dim WSHShell
Set WSHShell = WScript.CreateObject("WScript.Shell")
WSHShell.RegDelete "HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\Doc Find Spec MRU\"

 これは、「ファイルの検索」ダイアログで入力した、検索ファイル名の履歴を削除するものです。この履歴は、HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Doc Find Spec MRU\というキー以下に記録されているので、RegDeleteメソッドで、このキーごと削除しています。RegDeleteメソッドは、引数として指定した値の名前やキーを削除します。このように指定した文字列が"\"で終わっている場合は、値の名前ではなくキーとみなされます。(これはRegRead、RegWriteメソッドでも同じ)
 なお、RegRead、RegDeleteでは指定したキーや値の名前が存在しない場合、「指定したファイルが見つかりません」という実行時エラー(-2147024894)が発生します。この例ではOn Error Resume Nextを使って、キーが存在しない場合は何もせず終了するようにしています。


 このLessonではWSHShellのメソッドを紹介しました。どれも非常に有用なものなのでぜひマスターしておきましょう。WSHShellには他にもメソッド・プロパティがあるので、ここもあわせてご覧ください。
 次回はWshShellのオブジェクトであるWshShortcutオブジェクトを使って、ショートカットを作成する話をしたいと思います。


Home Up Back Next