RegWriteメソッドを用いると、任意のキーや任意のキーに任意のエントリを書き込むことができる。ここでは、アプリケーション・ソフトが設定を保持するのに通常用いられる「HKEY_CURRENT_USER\Software」キー以下に、ダミーのサブキー「WSH Lesson」を作成し、そこにダミーのエントリ(名前:「FutaenoKiwami」、種類:「REG_SZ」、値:「Axtu-!」)を書き込んでみよう。また、文字列だけではなく数値も書き込めることを示すために、2つ目のダミーのエントリ(名前:「Miku Age」、種類:「REG_DWORD」、値:「16」)も書き込む。さらに、キーに値が持てることを示すのに、名前:「(既定)」に種類:「REG_DWORD」、値:「13」も書き込む。このサンプルを動作させる際は、レジストリ・エディタを立ち上げて該当キーを追いながら、どのように値が書き込まれていくかを追ってもらいたい。
※ファイル:WriteReg.vbs
Option Explicit
'オブジェクト変数の宣言とWshShellオブジェクトの作成。
Dim objWshShell
Set objWshShell = WScript.CreateObject("WScript.Shell")
'書き込むキー、エントリ名の宣言と代入。
Dim strRegKey
Dim lngRegKeyValue
Dim strRegEntry1,strRegEntry2
Dim strRegValue1,lngRegValue2
strRegKey = "HKEY_CURRENT_USER\Software\WSH Lesson\"
lngRegKeyValue = 13
strRegEntry1 = "FutaenoKiwami"
strRegValue1 = "Axtu-!"
strRegEntry2 = "Miku Age"
lngRegValue2 = 16
'文字列のエントリを書き込む。
objWshShell.RegWrite strRegKey & strRegEntry1, strRegValue1,"REG_SZ"
'数値のエントリを書き込む。
objWshShell.RegWrite strRegKey & strRegEntry2, lngRegValue2,"REG_DWORD"
'キーに数値を書き込む。
objWshShell.RegWrite strRegKey, lngRegKeyValue,"REG_DWORD"
Set objWshShell = Nothing
このスクリプトを実行して、レジストリ・エディタを立ち上げると次のようなキーができているはずだ。
RegWriteメソッドは、エントリを書き込む場合は第1引数に「キー\エントリの名前」を、第2引数にエントリの値を、第3引数にエントリの種類を文字列で指定する。第3引数は省略でき、省略すると「REG_SZ」(文字列)が指定されたことになる。
なお、キーHKEY_CURRENT_USER\Software\WSH Lessonが存在しなくても、HKEY_CURRENT_USER\Software\WSH Lessonのエントリ(「FutaenoKiwami」と「Miku Age」)を第1引数に指定しRegWriteメソッドを実行することで自動的にキーも作成される。階層化されたキーを一度に作成することも可能だ。逆にキーだけを作成したい場合は、「キー\」を第1引数に指定し、第2引数に「""」(長さ0の文字列)を指定すればよい(厳密にはキーの値が「(値の設定なし)」のキー(値がないキー)はRegWriteメソッド単独では作れない。一度ダミーのエントリをRegWriteメソッドで作成し、その後そのエントリを次に述べるRegDeleteメソッドで削除することで可能である)。
※注:RegWriteメソッドではREG_BINARY値はLong型の最大値までしか書き込めない。それを超える値を書き込みたい場合はWMIを使う必要がある。SetBinaryValueメソッドの引数にArray関数で作ったバリアント配列を渡すことで可能となる。詳しくは、以下のページを参照していただきたい。
・Hey, Scripting Guy!「バイナリ データをレジストリに書き込む方法はありますか」(マイクロソフトTechNet)
レジストリからキーやエントリを削除するにはRegDeleteメソッドを用いる。先ほど作ったダミーのエントリとキーを削除する例をご覧にいれよう。
※ファイル:DeleteReg.vbs
Option Explicit
'オブジェクト変数の宣言とWshShellオブジェクトの作成。
Dim objWshShell
Set objWshShell = WScript.CreateObject("WScript.Shell")
'書き込むキー、エントリ名の宣言と代入。
Dim strRegKey
Dim lngRegKeyValue
Dim strRegEntry1,strRegEntry2
Dim strRegValue1,lngRegValue2
strRegKey = "HKEY_CURRENT_USER\Software\WSH Lesson\"
strRegEntry1 = "FutaenoKiwami"
strRegEntry2 = "Miku Age"
'エントリを削除する(この部分はなくてもOK)。
objWshShell.RegDelete strRegKey & strRegEntry1
objWshShell.RegDelete strRegKey & strRegEntry2
'キーを削除する
objWshShell.RegDelete strRegKey
Set objWshShell = Nothing
このようにRegDeleteメソッドの引数に削除したいキーやエントリを渡すと、それらが削除される。キーを削除する際は後ろに「\」を付ける、エントリを削除する場合は付けないのがここでもポイントとなる。この例では最初にエントリを削除してからキーを削除しているが、エントリをすべて削除せずともキーだけを削除すればエントリごとすべて消える。
少し応用例を示そう。先ほども書いた通り、「HKEY_CLASSES_ROOT\.<拡張子>」キーには、関連付けの情報が含まれている。ここにサブキー「ShellNew」を作成し、その中に「NullFile」という長さ0のREG_SZ(文字列)のエントリを作成すると、再ログオン後にエクスプローラの新規作成メニューから、そのファイルを作成することができるようになる。ここでは、vbsファイルを新規作成できるようにしてみよう。また、すでにその設定がされている場合は設定を解除するようにしよう。これを問題とする。なお、このスクリプトをWindows Vista上で実行する場合は管理者権限でコマンド・プロンプトを起動し([スタート]メニュー上の[コマンド プロンプト]を右クリックし、ポップアップ・メニューから[管理者として実行]を選択する)、そこからwscript.exe MakeVBSNullFileRegEntry.vbsと実行してもらいたい(HKEY_CLASSES_ROOTへの書き込みには管理者権限が必要なため)。
マーカーで隠れたところを選択してチェックしてみよう。
※ファイル:MakeVBSNullFileRegEntry.vbs
Option Explicit
'オブジェクト変数の宣言とWshShellオブジェクトの作成。
Dim objWshShell
Set objWshShell = WScript.CreateObject("WScript.Shell")
Dim strRegKey, strRegEntry, strRegValue
'参照するレジストリ・キーおよびレジストリ・エントリを指定。
strRegKey = "HKEY_CLASSES_ROOT\.vbs\ShellNew\"
strRegEntry = strRegKey & "NullFile"
'エントリに書き込む値を指定。
strRegValue = ""
On Error Resume Next
'ためしにレジストリ・エントリを読み込んでみる。
objWshShell.RegRead strRegEntry
If Err.Number = -2147024894 Then
On Error Goto 0
'もしエラーならエントリがないということなので書き込む。
objWshShell.RegWrite strRegEntry, strRegValue, "REG_SZ"
MsgBox "新規作成メニューにvbsファイルを登録しました。"
On Error Resume Next
ElseIf Err.Number = 0 Then
On Error Goto 0
'もしエラーでなければエントリがあるということなので削除する。
objWshShell.RegDelete strRegKey
MsgBox "新規作成メニューからvbsファイルを削除しました。"
End If
Err.Clear
Set objWshShell = Nothing
このスクリプトを実行したのち再ログオンすると、新規作成メニューに[VBScript Script ファイル]が追加されているはずである。また、もう一度このスクリプトを実行すると設定が削除され、再ログオン後にはメニューに表示されなくなるはずである。
Copyright© Digital Advantage Corp. All Rights Reserved.