【bat】バッチファイルでレジストリを操作する方法(reg add / reg query)

bat

レジストリの自動変更は運用やキッティングでよく行われますが、手作業だとミスや再現性の問題が出やすくなります。バッチファイルからregコマンドを使えば、設定の追加や取得、削除、バックアップまでコードで一元管理できます。ここではreg addとreg queryを中心に、実務で使えるテンプレートと注意点をまとめます。

前提と基本の考え方

レジストリ変更の多くは管理者権限が必要です。UACで昇格してから実行する、または管理者として起動したコンソールから実行するのが安全です。変更前に必ずバックアップを取得し、実行後はreg queryで検証する流れにしておくと事故を減らせます。64bit OSではWOW6432Node配下との違いに注意し、/reg:64または/reg:32で明示的にビットネスを指定すると混乱を防げます。

reg addで値を追加・更新する

既存値の上書きは既定で行われます。/vで値の名前、/tで型、/dでデータ、/fで確認なし上書きを指定します。値名未指定(/ve)で既定値も扱えます。

@echo off
setlocal

rem 文字列(REG_SZ)の追加・更新
reg add "HKCU\Software\Contoso\App" /v InstallPath /t REG_SZ /d "C:\Program Files\Contoso\App" /f

rem 展開文字列(REG_EXPAND_SZ)の追加(環境変数を含むパスを展開して使いたい場合に便利)
reg add "HKCU\Software\Contoso\App" /v DataDir /t REG_EXPAND_SZ /d "%%USERPROFILE%%\AppData\Local\Contoso" /f

rem DWORDの追加(10進数)と16進数
reg add "HKLM\SOFTWARE\Contoso\App" /v Enabled /t REG_DWORD /d 1 /f
reg add "HKLM\SOFTWARE\Contoso\App" /v Flags   /t REG_DWORD /d 0x00000020 /f

rem 既定値(既定)を設定
reg add "HKCU\Software\Contoso\App" /ve /t REG_SZ /d "DefaultValue" /f

endlocal

REG_MULTI_SZの扱い

複数行文字列は\nではなくヌル区切りで渡します。バッチでは\0を使い、末尾に\0\0で終端します。

reg add "HKCU\Software\Contoso\App" /v Servers /t REG_MULTI_SZ /d "srv01\0srv02\0srv03\0\0" /f

reg queryで値を取得・検証する

スクリプト内で設定の有無や値を確認して分岐できます。/vで特定値、/sでサブキー再帰、/fで検索文字列を指定できます。

@echo off
set "KEY=HKCU\Software\Contoso\App"

rem 値の存在確認
reg query "%KEY%" /v InstallPath >nul 2>&1
if errorlevel 1 (
  echo InstallPath が見つかりません
) else (
  echo InstallPath が存在します
)

rem 値の取り出しと変数格納(for /fでパース)
for /f "tokens=1,2,*" %%A in ('reg query "%KEY%" /v InstallPath ^| find /i "InstallPath"') do (
  set "INSTALL=%%C"
)
echo 取得したパス: %INSTALL%

rem キー全体の列挙
reg query "%KEY%" /s

存在しない場合だけ作成する条件分岐

毎回上書きしたくない設定は、先にqueryしてからaddします。

@echo off
set "KEY=HKLM\SOFTWARE\Contoso\App"
set "NAME=Flags"

reg query "%KEY%" /v "%NAME%" >nul 2>&1
if errorlevel 1 (
  echo Flags が無いので作成します
  reg add "%KEY%" /v "%NAME%" /t REG_DWORD /d 32 /f
) else (
  echo 既に存在するためスキップします
)

reg deleteで設定を削除する

値だけ消す場合とキーごと削除する場合でスイッチが異なります。/fを付けないと確認が入ります。

@echo off
rem 値の削除
reg delete "HKCU\Software\Contoso\App" /v TempPath /f

rem キーごと削除(配下もまとめて削除)
reg delete "HKCU\Software\Contoso\App" /f

64bit/32bitレジストリビューの指定

32bitアプリ互換キーに書き込むか、本来の64bit側に書き込むかを明示します。混在環境では必ず付ける運用にすると安全です。

rem 64bitビューへ
reg add "HKLM\SOFTWARE\Contoso\App" /v Enabled /t REG_DWORD /d 1 /f /reg:64

rem 32bitビュー(WOW6432Node 相当)へ
reg add "HKLM\SOFTWARE\Contoso\App" /v Enabled /t REG_DWORD /d 1 /f /reg:32

バックアップとリストア

変更前にエクスポートしておけば即時復旧できます。/yで上書き、/reg:64などの付与も可能です。

@echo off
set "KEY=HKCU\Software\Contoso\App"
set "BAK=%~dp0backup_App.reg"

rem バックアップ
reg export "%KEY%" "%BAK%" /y

rem 復元
rem reg import "%BAK%"

安全運用のためのテンプレート

実行順序を「バックアップ→変更→検証→ログ出力」に固定するとトラブル時の切り戻しが容易です。以下は一連の流れをまとめた雛形です。

@echo off
setlocal enableextensions

set "KEY=HKLM\SOFTWARE\Contoso\App"
set "LOG=%~dp0reg_setup.log"
set "BAK=%~dp0backup_%DATE:~0,10%.reg"

echo [%DATE% %TIME%] 開始 >> "%LOG%"

rem 1) バックアップ
reg export "%KEY%" "%BAK%" /y >> "%LOG%" 2>&1

rem 2) 変更
reg add "%KEY%" /v Enabled   /t REG_DWORD /d 1 /f /reg:64 >> "%LOG%" 2>&1
reg add "%KEY%" /v InstallPath /t REG_SZ /d "C:\Program Files\Contoso\App" /f /reg:64 >> "%LOG%" 2>&1

rem 3) 検証
reg query "%KEY%" /v Enabled /reg:64 | find "0x1" >nul
if errorlevel 1 (
  echo [%DATE% %TIME%] 検証失敗: Enabled が想定値でないためロールバックします >> "%LOG%"
  reg import "%BAK%" >> "%LOG%" 2>&1
  echo 失敗しました。詳細はログを確認してください。
  exit /b 1
)

echo [%DATE% %TIME%] 正常終了 >> "%LOG%"
endlocal
exit /b 0

トラブル対処の勘所

アクセス拒否が出る場合は権限不足やUACの未昇格が原因のことが多く、管理者として実行し直してください。パスにスペースがあるキーや値は必ず二重引用符で囲みます。REG_MULTI_SZの書式誤りは反映されない原因になりやすく、\0終端のルールを厳守します。64bit/32bitの取り違えは「書いたはずなのに見えない」典型例で、/regスイッチかレジストリエディタのビューを確認します。

まとめ

reg addとreg queryを組み合わせれば、レジストリ設定の追加・更新・検証をバッチで再現性高く自動化できます。変更前のreg export、ビットネスの明示、実行後のquery検証、ログ出力の四点を徹底すれば、現場で安心して運用できるスクリプトになります。