今回はレジストリを操作するメソッドのほか、イベント・ログの記録や環境変数の展開、ポップアップ・ウィンドウ表示のためのメソッドについて解説。
今回は、前回に引き続いてWshShellオブジェクトのメンバ(メソッド/プロパティ)について解説する。 前回に引き続いてWshShellオブジェクトのメンバと、それから派生するオブジェクトのメンバを記したオブジェクト・モデル図をここに示す。今回は以下の赤い矢印で示したメンバについて取り上げる。
レジストリはWindowsやアプリケーションの設定情報が格納されたファイルであり、設定情報がOSやアプリケーションによって書き込まれ、必要に応じて参照される。ユーザーがレジストリを直接編集することは通常はないうえ、いたずらにいじるとシステムが破壊されてしまう危険性も伴うのでできれば避けた方がよい。だが、どうしても必要な場合はレジストリ・エディタなどで閲覧、値の書き込みや変更を行う。その場合、同じレジストリ操作を繰り返し行う必要があるのなら、スクリプトで行った方が効率的であるし、間違いの発生も減らせる。WSH(Windows Script Host)ではレジストリ操作のためのメソッドとして、WshShellオブジェクトに、レジストリの値を読み込む「RegReadメソッド」、レジストリに値を書き込む「RegWirteメソッド」、レジストリの値を削除する「RegDeleteメソッド」の3つのメソッドが用意されている。今回はこれらの使い方について説明する。なお、先ほども述べたようにレジストリの操作はシステムや設定を破壊してしまう危険も伴うので、サンプルを実行する際は十分注意を払っていただきたい。
■連載目次
第1回 WSHを始めよう
第2回 VBScript基本(1)文字列の入出力
第3回 VBScript基本(2)計算と分岐処理
第4回 関数を使いこなす:文字列、数値、日付
第5回 データ型について理解を深めよう
第6回 VBScriptの配列を極める
第7回 Subプロシージャで処理を定義
第8回 Functionプロシージャで関数を定義
第9回 VBScriptのオブジェクトを使いこなす
第10回 WScriptオブジェクト(1)
第11回 WScriptオブジェクト(2)
第12回 WshShellオブジェクト(1)
第13回 WshShellオブジェクト(2)
第14回 WshShellオブジェクト(3)
第15回 WshNetworkオブジェクト
第16回 FileSystemObjectオブジェクト(1)
第17回 FileSystemObjectオブジェクト(2)
第18回 FileSystemObjectオブジェクト(3)
第19回 TextStream/Dictionaryオブジェクト
レジストリを読み込むRegReadメソッドを説明する前に、レジストリの構造を簡単に説明しておこう。レジストリはファイル・システムと同様に、ツリー状の構造を持っている。ファイル・システムでいうところのフォルダに当たるもの(ノード)をレジストリ・キー(単にキーともいう)といい、その中に、ファイル・システムでいうところのファイルに当たるレジストリ・エントリ(単にエントリともいう)および、サブフォルダに当たるレジストリ・サブキー(単にサブキーともいう。親キーに対してサブキーという親子関係がある)が含まれている。レジストリ・エディタ(regedit.exe)を実行してみると、左ペインにキーが、右ペインにエントリが表示される。エクスプローラと同様のインターフェイスである。
キーのルート(ファイル・システムのドライブに相当)は次のようなものが存在する。
ルート・キー名 | 省略名 | 内容 |
---|---|---|
HKEY_CLASSES_ROOT | HKCR | ファイル・タイプやクラスIDの設定 |
HKEY_CURRENT_USER | HKCU | 現在のユーザーに適用される設定 |
HKEY_LOCAL_MACHINE | HKLM | すべてのユーザーに適用される設定 |
HKEY_USERS | ― | HKCUの初期設定とすべてのユーザーの設定(各ユーザーのHKCU) |
HKEY_CURRENT_CONFIG | ― | 現在の構成に関する設定 |
レジストリのルート・キーの種類 |
これらのルート・キーに、キー(サブキー)が複数階層存在している。
実際の設定が書き込まれるのはキーに含まれるエントリである。エントリは、「エントリの名前」(「値の名前」ともいう)、「エントリの種類」、そして「エントリのデータ」(「値」ともいう)で構成されている。エントリの名前はエントリがどういうものであるかを示す名前であり、エントリの種類はデータの種類を示し、次表のような種類がある。エントリのデータは実際の設定値が書き込まれたものである。
エントリの種類 | 意味 | VBScriptでの型 |
---|---|---|
REG_SZ | 文字列 | String |
REG_DWORD | 数値 | Long |
REG_BINARY | バイナリ値(2進数の値) | Byteの配列 |
REG_EXPAND_SZ | 展開可能な文字列 | String |
REG_MULTI_SZ | 文字列の配列 | Stringの配列 |
エントリの種類とその意味 |
ファイル・システムと違う点は、キーにも値が存在することである。キーの値はレジストリ・エディタ上ではエントリの名前が「(既定)」と表示されているものである(「(既定)」という名前のエントリが存在しているわけではなく、あくまでキーの値を示すものであることに注意)。
さて、RegReadメソッドはこのようなエントリやキーの値を読むためのメソッドである。簡単な例を示そう。「HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders」キーには特殊フォルダのパスを格納したエントリが複数含まれているが(レジストリ・エディタで実際に見てみることをお勧めする)、ここでは「お気に入り」フォルダのパスを含んだ「Favorites」というエントリの値を取得してみよう。
※ファイル:ReadFavoritesFolderPath.vbs
Option Explicit
'オブジェクト変数の宣言とWshShellオブジェクトの作成。
Dim objWshShell
Set objWshShell = WScript.CreateObject("WScript.Shell")
'読み込むエントリを定数として宣言。
Const REG_FAVORITES = _
"HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders\Favorites"
'RegReadメソッドを使って、Favoritesフォルダの場所を調べる。
MsgBox objWshShell.RegRead(REG_FAVORITES)
Set objWshShell = Nothing
このスクリプトを実行すると、次のようなメッセージ・ボックスが表示される。
このように、お気に入りフォルダの場所が取得できた。
RegReadメソッドでエントリのデータを読み込む際は引数に「キー\エントリの名前」を与えることがポイントである。なお“HKEY_CURRENT_USER”の部分は省略名である“HKCU”を使用することも可能である。すなわち、
Const REG_FAVORITES = _
"HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders\Favorites"
と簡略に表記することが可能だ。
値の存在するキーの値(「(既定)」値)を読むには、RegReadメソッドの引数に「キー\」という、キーの後ろに「\」を加えた文字列を与える。例えば、「HKEY_CLASSES_ROOT\.<拡張子>」キーには、その拡張子のファイル・タイプを示す値が格納されている(関連TIPS記事参照)。これを取得してみよう。ここでは、vbsファイルのファイル・タイプを取得する。
※ファイル:ReadVBSFileType
Option Explicit
'オブジェクト変数の宣言とWshShellオブジェクトの作成。
Dim objWshShell
Set objWshShell = WScript.CreateObject("WScript.Shell")
'vbsファイルのファイル・タイプを取得。
MsgBox objWshShell.RegRead("HKCR\.vbs\")
Set objWshShell = Nothing
このスクリプトを実行すると、次のようなメッセージ・ボックスが表示される。
これまではREG_SZ(文字列)の値を読む例を示したが、もちろんREG_DWORDなどの値も読み込むことができる。REG_DWORDの場合は結果がString型ではなくLong型で返されるところに注意が必要だ。また、REG_BINARYはByte型の配列として返されるので、各要素を取得するにはFor Each〜Next文などを使うか、Join関数などを使う必要がある。詳しくは配列を取り上げた第6回「VBScriptの配列を極める」を参照してもらいたい。Byte型数値を16進数で表示したい場合はHex関数を使うことも覚えておくとよいだろう。
なお、RegReadメソッドは存在しないキーやエントリを引数に指定するとエラーが発生することから、キーやエントリの存在を確認するのにも使える。例を示そう。
※ファイル:CheckReg.vbs
Option Explicit
'オブジェクト変数の宣言とWshShellオブジェクトの作成。
Dim objWshShell
Set objWshShell = WScript.CreateObject("WScript.Shell")
Dim strRegEntry
'存在しないキーを指定。
strRegEntry = "HKEY_CURRENT_USER\Software\Nice boat."
On Error Resume Next
objWshShell.RegRead strRegEntry
If Err.Number = -2147024894 Then
Msgbox strRegEntry & "というレジストリ・キーorエントリはありません"
ElseIf Err.Number = 0 Then
Msgbox strRegEntry & "というレジストリ・キーorエントリは存在します"
End If
Err.Clear
On Error Goto 0
Set objWshShell = Nothing
RegReadメソッドが失敗する、すなわち引数に与えられたレジストリ・キーやエントリが存在しない場合、エラー番号-2147024894のエラーが発生するので、それでキー/エントリの存在確認ができる。
※注:WshShellオブジェクトでは、あるキーに含まれるエントリやサブキーを列挙することはできない。これを行うにはWMIを使用する必要がある。詳しくは以下のページなどを参照していただきたい。
Copyright© Digital Advantage Corp. All Rights Reserved.