検索
連載

第13回 WshShellオブジェクトを利用する(2)基礎解説 演習方式で身につけるチェック式WSH超入門(1/3 ページ)

今回はレジストリを操作するメソッドのほか、イベント・ログの記録や環境変数の展開、ポップアップ・ウィンドウ表示のためのメソッドについて解説。

Share
Tweet
LINE
Hatena
基礎解説 演習方式で身につけるチェック式WSH超入門
Windows Server Insider


「基礎解説 演習方式で身につけるチェック式WSH超入門」のインデックス

連載目次

 今回は、前回に引き続いてWshShellオブジェクトのメンバ(メソッド/プロパティ)について解説する。 前回に引き続いてWshShellオブジェクトのメンバと、それから派生するオブジェクトのメンバを記したオブジェクト・モデル図をここに示す。今回は以下の赤い矢印で示したメンバについて取り上げる。


WshShellオブジェクトのオブジェクト・モデル図
今回はWshShellオブジェクトに含まれるメンバのうち、赤い矢印で示したメンバについて説明する。

レジストリを参照・操作するメソッド

 レジストリはWindowsやアプリケーションの設定情報が格納されたファイルであり、設定情報がOSやアプリケーションによって書き込まれ、必要に応じて参照される。ユーザーがレジストリを直接編集することは通常はないうえ、いたずらにいじるとシステムが破壊されてしまう危険性も伴うのでできれば避けた方がよい。だが、どうしても必要な場合はレジストリ・エディタなどで閲覧、値の書き込みや変更を行う。その場合、同じレジストリ操作を繰り返し行う必要があるのなら、スクリプトで行った方が効率的であるし、間違いの発生も減らせる。WSH(Windows Script Host)ではレジストリ操作のためのメソッドとして、WshShellオブジェクトに、レジストリの値を読み込む「RegReadメソッド」、レジストリに値を書き込む「RegWirteメソッド」、レジストリの値を削除する「RegDeleteメソッド」の3つのメソッドが用意されている。今回はこれらの使い方について説明する。なお、先ほども述べたようにレジストリの操作はシステムや設定を破壊してしまう危険も伴うので、サンプルを実行する際は十分注意を払っていただきたい。

レジストリの値を読み込むRegReadメソッド

 レジストリを読み込むRegReadメソッドを説明する前に、レジストリの構造を簡単に説明しておこう。レジストリはファイル・システムと同様に、ツリー状の構造を持っている。ファイル・システムでいうところのフォルダに当たるもの(ノード)をレジストリ・キー(単にキーともいう)といい、その中に、ファイル・システムでいうところのファイルに当たるレジストリ・エントリ(単にエントリともいう)および、サブフォルダに当たるレジストリ・サブキー(単にサブキーともいう。親キーに対してサブキーという親子関係がある)が含まれている。レジストリ・エディタ(regedit.exe)を実行してみると、左ペインにキーが、右ペインにエントリが表示される。エクスプローラと同様のインターフェイスである。


レジストリ・エディタの画面
レジストリ・エディタを起動するには、[スタート]メニューの[ファイル名を指定して実行]で「regedit」と入力して実行する。起動すると、左ペインに階層構造を持つキーが、右ペインにエントリが表示される。
  (1)ルート・キーの1つ。
  (2)キー(サブキー)。
  (3)エントリの名前。値の名前ともいう。
  (4)エントリの種類(型)。
  (5)エントリのデータ(値)。

 キーのルート(ファイル・システムのドライブに相当)は次のようなものが存在する。

ルート・キー名 省略名 内容
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メソッドでレジストリ・エントリのデータを読み込む
ここでは、現在ログオンしているユーザーの「お気に入り」フォルダのフルパスをレジストリから取得している。

 このように、お気に入りフォルダの場所が取得できた。

 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

 このスクリプトを実行すると、次のようなメッセージ・ボックスが表示される。


RegReadメソッドでレジストリ・キーのデータを読み込む
ここではvbsファイルのファイル・タイプを取得している。

 これまでは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.

       | 次のページへ
ページトップに戻る