バッチでレジストリエントリを取得する

たとえば、あるシステムの設定情報を確認するためにその設定を一覧表示するようなバッチを考えた場合、設定は大体、DB上か、xmlファイル上か、iniファイル上か、confファイル上か、レジストリ上にあることが予想される。まあサービスの起動条件*1やらネットワーク設定*2やらは、専用のコマンドたたけばいいだろう。
このとき、xmlファイルやiniファイルから設定値を持ってくるのは比較的容易だ。findかfindstrにファイルを渡して、設定キーを検索させて表示すればいいだけだ。DBから値を取得する場合も、例えばSQLServerであれば、osqlを用いて値を取得することが考えられる。
問題はレジストリエントリから値を取得したい場合だ。基本的な方法は同じであるが、少々めんどくさい。こんな手順を使う。
たとえば[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run]の「Windows Defender」の値を知りたいような場合こんな風に記述する。

set WORKFILE=work.txt
Regedit /E %WORKFILE% "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run"
for /F "tokens=1-2 delims=/=" %%a in ('find /i "Windows Defender" %WORKFILE%') do SET WDK=%%b
echo %WDK%
pause
del %WORKFILE%
pause

2行目 まずRegedit /Eにてレジストリエントリを書き出す。
3行目 書き出したレジストリエントリからWindows Defenderを含んだ行を検索し('find /i "Windows Defender" %WORKFILE%')、=記号をデリミタとみなして(delims=/=)分割。分割によって発生した2つの文字列の2番目を変数WDKに入れる(WDK=%%b)。

*1:sc query サービス名

*2:hostnameとかipconfigとか