2012-03-21
今日もミスのフォローのためのスクリプトを書きました。WSHでレジストリをいじるのが非常に面倒なことを改めて知って衝撃をうけちゃいました。
- サブキーの列挙ができない
- キーの存在判定ができない
- レジストリキーのリネームができない
なんでもっと機能ないんでしょうね?よく理解出来ないです。
サブキーの列挙はWMIでやりました。
Function GetChildNode(regPath)
echo "GetChildNode Called"
Set Locator = CreateObject("WbemScripting.SWbemLocator")
Set Service = Locator.ConnectServer(vbNullString, "root\default")
Set Reg = Service.Get("StdRegProv")
Const HKEY_CURRENT_USER = &H80000001
Const TARGETKEY = "regPath"
Reg.EnumKey HKEY_CURRENT_USER, regPath, SubKey
GetChildNode = SubKey
End Function
キーの存在判定は以下の情報を元にIsNull関数で行けるかと思ったのですが
-
[WSH レジストリのキーが存在するかチェックしたい OKWave](http://okwave.jp/qa/q2469915.html) - Hey, Scripting Guy! : 値がレジストリに存在するかどうかを確認することはできますか
結局、前者のコードは動かず、後者はレジストリパス自体の値の取得方法がわからず(ちゃんとドキュメント読めばわかるのだと思うのだけど)。今回は上位のパスのサブキーを前述のコードで取得して、その中に目的のものがあるかどうか…という方法で逃げちゃいました。
レジストリキーのリネームは結局方法がないから全部読み取ってあげて、別途書き込んであげて、消してあげて…っていうことをしなくてはいけないらしく、そんなコードを全部書くのいやだよー、めんどうだよーって思いながらgoogleで探していたら下記の記事があったのでこのコンセプトを拝借しました。
regeditを使ってしまうっていう方法ですね。結局これが一番楽っぽいです。1点注意はVista以降でUACが有効な環境では管理者として実行されたコマンドプロンプトで無くてはうまく動かないということですね。
PowerShellならcd HKCU:ってやって、該当の箇所まで移動してrename-itemで一発なんですけどねぇ…。早くPowerShellが標準搭載されたPCしかないような時代になってほしいです。