今日もミスのフォローのためのスクリプトを書きました。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関数で行けるかと思ったのですが

結局、前者のコードは動かず、後者はレジストリパス自体の値の取得方法がわからず(ちゃんとドキュメント読めばわかるのだと思うのだけど)。今回は上位のパスのサブキーを前述のコードで取得して、その中に目的のものがあるかどうか…という方法で逃げちゃいました。

レジストリキーのリネームは結局方法がないから全部読み取ってあげて、別途書き込んであげて、消してあげて…っていうことをしなくてはいけないらしく、そんなコードを全部書くのいやだよー、めんどうだよーって思いながらgoogleで探していたら下記の記事があったのでこのコンセプトを拝借しました。

regeditを使ってしまうっていう方法ですね。結局これが一番楽っぽいです。1点注意はVista以降でUACが有効な環境では管理者として実行されたコマンドプロンプトで無くてはうまく動かないということですね。

PowerShellならcd HKCU:ってやって、該当の箇所まで移動してrename-itemで一発なんですけどねぇ…。早くPowerShellが標準搭載されたPCしかないような時代になってほしいです。

以前からの懸案事項だったWSHのUnitTestに関してVBAUnit以外にもScriptUnit, ComUnitという使えそうなものがあることを発見。日本人で使っている人はほぼいないみたいだけど試してみてよさそうな方を使っていこうと思います。

WSHでUnitテストがしたいです。どうにかしてしたい。VBAUnitを使うしかないかなぁ・・・。移植仕様かなぁ・・・。

今まで無くて不便だなぁと、VBAにはCollectionオブジェクトがあるのになぁと思っていたのですが、今日再度調べてみたら、WSHにもDictionaryオブジェクトがあることに気がつきました。ヘルプはこちら

ヘルプはちゃんと読まなくちゃだめですね・・・。