レジストリの自動変更は運用やキッティングでよく行われますが、手作業だとミスや再現性の問題が出やすくなります。バッチファイルから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検証、ログ出力の四点を徹底すれば、現場で安心して運用できるスクリプトになります。