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

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

Windowsのレジストリをバッチファイルから自動操作できれば、アプリ設定の一括投入・セキュリティ強化・キッティング作業を完全に自動化できます。手作業でレジストリエディタを開いて設定する手間をなくし、何台のPCにも同じ設定を確実に適用できます。

reg コマンド(reg add / reg query / reg delete / reg export など)はWindows標準のコマンドラインツールです。管理者権限さえあれば追加インストール不要で動作し、バッチファイルから直接呼び出せます。本記事ではコマンドの構文・オプションから実践テンプレートまでを網羅します。

この記事では、reg add で値を追加・更新する方法reg query で値を取得して変数に格納する方法条件分岐・削除・64bit/32bitビュー指定・バックアップ・比較まで、Windows管理・IT担当者・自動化を目指す中級者向けに体系的に解説します。

スポンサーリンク

レジストリの基本構造

レジストリはハイブ・キー・値・型の4層構造です。reg コマンドを使いこなすには、まずこの構造を理解しておく必要があります。

概念 説明
ハイブ(Hive) レジストリの最上位区分。省略形で指定可能 HKLM, HKCU, HKCR, HKU, HKCC
キー(Key) フォルダに相当する階層構造。バックスラッシュで区切る HKLM\SOFTWARE\MyApp
値(Value) キー内に格納される名前付きデータ。既定値は名前が空(””) Version, InstallPath
型(Type) 値のデータ形式を指定する REG_SZ, REG_DWORD など
ハイブ略称 フルネーム 用途
HKLM HKEY_LOCAL_MACHINE PC全体に適用するシステム設定
HKCU HKEY_CURRENT_USER ログイン中ユーザーの設定
HKCR HKEY_CLASSES_ROOT ファイル関連付け・COMクラス
HKU HKEY_USERS 全ユーザープロファイル
HKCC HKEY_CURRENT_CONFIG 現在のハードウェア構成
型名 説明 用途例
REG_SZ 通常の文字列(null終端) パス、バージョン文字列
REG_EXPAND_SZ 環境変数展開付き文字列 %SystemRoot%\system32 など
REG_DWORD 32ビット整数(符号なし) フラグ(0/1)、タイムアウト値
REG_QWORD 64ビット整数 大きな数値、タイムスタンプ
REG_BINARY バイナリデータ(16進数) ハードウェア情報、暗号化データ
REG_MULTI_SZ 複数の文字列(\0区切り) 依存サービスのリストなど

reg コマンド一覧

reg コマンドには複数のサブコマンドがあります。用途に応じて使い分けます。

サブコマンド 機能 主な用途
reg add キー・値の追加・更新 設定の書き込み、キッティング
reg query キー・値の読み取り 設定確認、変数への格納
reg delete キー・値の削除 設定のクリーンアップ
reg export キーを .reg ファイルに書き出す 変更前のバックアップ
reg import .reg ファイルをレジストリに適用 バックアップからの復元
reg copy キーを別の場所にコピー 設定の複製・移行
reg save キーをハイブファイルとして保存 低レベルバックアップ
reg load ハイブファイルをマウント オフラインOS修復
reg compare 2つのキーを比較 変更前後の差分確認

reg add の構文とオプション

構文
reg add KeyName [/v ValueName | /ve] [/t Type] [/s Separator] [/d Data] [/f] [/reg:32|/reg:64]
オプション 説明 省略時の動作
/v ValueName 書き込む値の名前 既定値(既定)に書き込む
/ve 既定値(空名)に明示的に書き込む
/t Type データ型の指定 REG_SZ
/d Data 書き込む値のデータ 空文字列
/f 確認なしで上書き 既存値があると上書き確認が出る
/s Separator REG_MULTI_SZ の区切り文字 \0(null)
/reg:32 32ビットレジストリビューに書き込む プロセスのビットネスに準じる
/reg:64 64ビットレジストリビューに書き込む プロセスのビットネスに準じる

バッチでの注意点

  • /f を付けないと、値が既存の場合にバッチが確認入力待ちで止まります
  • 自動実行バッチでは必ず /f を付けてください
  • KeyName にスペースが含まれる場合はダブルクォートで囲みます

型別の reg add サンプル

REG_SZ(文字列)

REG_SZ — 通常の文字列値
rem アプリのインストールパスを書き込む
reg add "HKLM\SOFTWARE\MyApp" /v InstallPath /t REG_SZ /d "C:\Program Files\MyApp" /f

rem 既定値((既定))に書き込む場合は /ve を使う
reg add "HKLM\SOFTWARE\MyApp" /ve /t REG_SZ /d "MyApp v2.0" /f

REG_EXPAND_SZ(環境変数展開付き文字列)

REG_EXPAND_SZ — 環境変数展開付き
rem %SystemRoot% などを含むパスはこの型を使う
reg add "HKLM\SOFTWARE\MyApp" /v LogPath /t REG_EXPAND_SZ /d "%TEMP%\MyApp\logs" /f

REG_DWORD(32ビット整数)

REG_DWORD — 整数フラグ・数値
rem 10進数で指定
reg add "HKLM\SOFTWARE\MyApp" /v Enabled /t REG_DWORD /d 1 /f

rem 16進数で指定(0x プレフィックス)
reg add "HKLM\SOFTWARE\MyApp" /v Timeout /t REG_DWORD /d 0x1E /f

REG_QWORD(64ビット整数)

REG_QWORD — 64ビット整数
rem 大きな整数値が必要な場合
reg add "HKLM\SOFTWARE\MyApp" /v MaxSize /t REG_QWORD /d 1073741824 /f

REG_BINARY(バイナリ)

REG_BINARY — 16進数バイト列
rem 16進数をスペースなしで列挙する
reg add "HKLM\SOFTWARE\MyApp" /v RawData /t REG_BINARY /d 0102030405 /f

REG_MULTI_SZ(複数文字列)

REG_MULTI_SZ — 複数文字列(区切り文字指定)
rem /s で区切り文字を指定。デフォルトの \0 は cmd から入力できないため \0 の代わりに \0 を使う
rem 実際には /s オプションで別の区切り文字(例: \)を指定してデータを区切る
reg add "HKLM\SOFTWARE\MyApp" /v Servers /t REG_MULTI_SZ /s "\" /d "server1\server2\server3" /f

注意:REG_MULTI_SZ を reg add でコマンドラインから設定する場合、null文字(\0)を直接入力できないため /s で代替区切り文字を指定します。複雑な複数文字列は .reg ファイルで管理するほうが確実です。

reg query の構文とオプション

構文
reg query KeyName [/v ValueName | /ve] [/s] [/se Separator] [/f Data] [/k] [/d] [/c] [/e] [/t Type] [/z] [/reg:32|/reg:64]
オプション 説明 使用例
/v ValueName 特定の値名を検索 /v InstallPath
/ve 既定値(空名)を検索
/s サブキーを再帰的に検索
/f Data データでフィルタ検索(ワイルドカード * 可) /f “MyApp*”
/k キー名のみ検索(値は対象外)
/d データのみ検索
/c 大文字・小文字を区別する
/e 完全一致のみ(部分一致しない)
/t Type 型でフィルタ /t REG_DWORD
/reg:32 32ビットビューから読み取る

reg query の値を変数に格納する方法

reg query の出力を for /f でパースして、バッチ変数に格納できます。出力形式は ValueName REG_SZ DataValue のようにスペース区切りです。

基本パターン — 値を変数に格納
@echo off
setlocal

rem reg query の出力から値部分だけ取り出す
for /f "tokens=2,*" %%A in (
    'reg query "HKLM\SOFTWARE\MyApp" /v InstallPath'
) do (
    rem %%A = 型名(REG_SZ など)、%%B = データ値
    set "INSTALL_PATH=%%B"
)

echo インストールパス: %INSTALL_PATH%
skip=2 でヘッダー行をスキップ
@echo off
setlocal

rem reg query の出力には先頭にキー名行が含まれる。skip=2 でキー名行と空行を飛ばす
for /f "skip=2 tokens=1,2,*" %%A in (
    'reg query "HKLM\SOFTWARE\MyApp" /v Version 2^>nul'
) do (
    set "REG_VAL_NAME=%%A"
    set "REG_TYPE=%%B"
    set "REG_DATA=%%C"
)

echo 値名: %REG_VAL_NAME%
echo 型  : %REG_TYPE%
echo データ: %REG_DATA%
DWORD 値を取得して数値比較する
@echo off
setlocal

for /f "tokens=2,*" %%A in (
    'reg query "HKLM\SOFTWARE\MyApp" /v Enabled 2^>nul'
) do set "ENABLED=%%B"

rem DWORD の出力は "0x1" などの16進数になる場合がある
if "%ENABLED%"=="0x1" (
    echo 機能は有効です
) else (
    echo 機能は無効です
)

ポイント:for /f の tokens 指定は出力の列数に合わせて調整します。reg query の出力は環境によって空白の数が変わることがあるため、tokens=2,*(2列目以降をすべて %%B に入れる)が最も安定します。

条件分岐:値の存在確認 → なければ作成するパターン

レジストリ値が存在するかどうかを確認してから書き込む、冪等性(何度実行しても同じ結果)のある処理を実装します。

値の存在確認 → なければ作成
@echo off
setlocal

set "REG_KEY=HKLM\SOFTWARE\MyApp"
set "REG_VAL=InstallPath"

rem reg query で存在確認(2>nul でエラー出力を抑止)
reg query "%REG_KEY%" /v %REG_VAL% 2>nul >nul
if %ERRORLEVEL% equ 0 (
    echo %REG_VAL% は既に存在します。スキップします。
) else (
    echo %REG_VAL% が存在しないため作成します。
    reg add "%REG_KEY%" /v %REG_VAL% /t REG_SZ /d "C:\Program Files\MyApp" /f
)
キー自体の存在確認
@echo off
setlocal

set "REG_KEY=HKLM\SOFTWARE\MyApp"

rem /v を指定せずにキー名だけで query するとキーの存在確認になる
reg query "%REG_KEY%" 2>nul >nul
if %ERRORLEVEL% equ 0 (
    echo キーが存在します: %REG_KEY%
) else (
    echo キーが存在しません。作成します。
    reg add "%REG_KEY%" /f
)
バージョン比較して古い場合のみ更新
@echo off
setlocal

set "NEW_VER=2.5.0"
set "CURRENT_VER="

for /f "tokens=2,*" %%A in (
    'reg query "HKLM\SOFTWARE\MyApp" /v Version 2^>nul'
) do set "CURRENT_VER=%%B"

if "%CURRENT_VER%"=="%NEW_VER%" (
    echo バージョンは最新です: %CURRENT_VER%
) else (
    echo バージョンを更新します: %CURRENT_VER% -> %NEW_VER%
    reg add "HKLM\SOFTWARE\MyApp" /v Version /t REG_SZ /d %NEW_VER% /f
)

reg delete で値・キーを削除する

構文
reg delete KeyName [/v ValueName | /ve | /va] [/f] [/reg:32|/reg:64]
オプション 説明
/v ValueName 指定した値のみ削除(キーは残る)
/ve 既定値(空名)を削除
/va キー内のすべての値を削除(キーは残る)
オプションなし キーとサブキー・値をすべて削除
/f 確認なしで削除(バッチでは必須)
削除サンプル
rem 特定の値だけ削除
reg delete "HKLM\SOFTWARE\MyApp" /v OldSetting /f

rem キー内のすべての値を削除(キーは残す)
reg delete "HKLM\SOFTWARE\MyApp" /va /f

rem キー全体(サブキー含む)を削除
reg delete "HKLM\SOFTWARE\MyApp" /f

rem 存在する場合のみ削除(エラーを無視)
reg query "HKLM\SOFTWARE\MyApp" /v TempValue 2>nul >nul
if %ERRORLEVEL% equ 0 (
    reg delete "HKLM\SOFTWARE\MyApp" /v TempValue /f
    echo TempValue を削除しました
)

注意:レジストリの削除は元に戻せません。削除前に必ず reg export でバックアップを取得してください。HKLM 配下の削除はシステム障害を引き起こす可能性があります。

64bit / 32bit ビュー指定(/reg:64, /reg:32)の仕組みと使い分け

64ビット版Windowsでは、32ビットアプリケーション用のレジストリキーが HKLM\SOFTWARE\WOW6432Node に分離されています。/reg:64 / /reg:32 オプションで操作対象のビューを明示的に指定できます。

オプション アクセス先 使用場面
/reg:64 HKLM\SOFTWARE(64ビットビュー) 64ビットアプリ設定を32ビットバッチから操作する
/reg:32 HKLM\SOFTWARE\WOW6432Node(32ビットビュー) 32ビットアプリ設定を64ビットバッチから操作する
省略 実行プロセスのビットネスに準じる バッチと操作対象が同じビット数のとき
状況 cmd.exe のビット数 対象アプリ 必要なオプション
通常の64bit環境 64bit 64bitアプリ 不要
64bit環境で32bitアプリを操作 64bit 32bitアプリ /reg:32
SysWOW64のcmd.exeを使用 32bit 64bitアプリ /reg:64
ビュー指定の実例
rem 64ビットビューに書き込む(64bitアプリの設定)
reg add "HKLM\SOFTWARE\MyApp64" /v Setting /t REG_SZ /d "value" /f /reg:64

rem 32ビットビューに書き込む(WOW6432Node 経由)
reg add "HKLM\SOFTWARE\MyApp32" /v Setting /t REG_SZ /d "value" /f /reg:32

rem 64ビットビューを読み取る
reg query "HKLM\SOFTWARE\MyApp64" /v Setting /reg:64

rem 32ビットビューを読み取る(WOW6432Node の内容が返る)
reg query "HKLM\SOFTWARE\MyApp32" /v Setting /reg:32

ポイント:キッティングバッチでは対象アプリのビット数を確認してから /reg:32 / /reg:64 を明示指定する習慣をつけると、「書いたはずの値が見当たらない」という問題を防げます。

reg export / import でバックアップ・リストアする

レジストリを変更する前に必ず reg export でバックアップを取り、問題が発生した場合は reg import で元に戻せるようにします。

構文
rem エクスポート(バックアップ)
reg export KeyName FileName.reg [/y]

rem インポート(リストア)
reg import FileName.reg
バックアップ付き変更パターン
@echo off
setlocal

set "REG_KEY=HKLM\SOFTWARE\MyApp"
set "BACKUP_DIR=%~dp0backup"
set "BACKUP_FILE=%BACKUP_DIR%\MyApp_%date:~0,4%%date:~5,2%%date:~8,2%.reg"

rem バックアップディレクトリ作成
if not exist "%BACKUP_DIR%" mkdir "%BACKUP_DIR%"

rem 変更前にバックアップ
echo バックアップ中: %BACKUP_FILE%
reg export "%REG_KEY%" "%BACKUP_FILE%" /y
if %ERRORLEVEL% neq 0 (
    echo エラー: バックアップに失敗しました
    exit /b 1
)

rem レジストリ変更
reg add "%REG_KEY%" /v NewSetting /t REG_DWORD /d 1 /f
echo 変更完了。問題があれば以下でリストア:
echo   reg import "%BACKUP_FILE%"
リストア(復元)
@echo off
setlocal

set "BACKUP_FILE=%~1"

if "%BACKUP_FILE%"=="" (
    echo 使い方: restore.bat [バックアップファイルパス]
    exit /b 1
)

if not exist "%BACKUP_FILE%" (
    echo エラー: ファイルが見つかりません: %BACKUP_FILE%
    exit /b 1
)

echo リストア中: %BACKUP_FILE%
reg import "%BACKUP_FILE%"
if %ERRORLEVEL% equ 0 (
    echo リストアが完了しました
) else (
    echo エラー: リストアに失敗しました
    exit /b 1
)

reg compare で変更前後を比較する

reg compare は2つのキーの差分を出力します。バックアップと現在の状態を比較して、何が変わったかを確認できます。

構文
reg compare KeyName1 KeyName2 [/v ValueName] [/ve] [/s] [/op n] [/reg:32|/reg:64]
オプション 説明
/s サブキーも再帰的に比較
/op 1 KeyName1 のみに存在する差分を表示
/op 2 KeyName2 のみに存在する差分を表示
/op 4 両方に存在するが値が異なるものを表示
/op 0 すべての差分を表示(デフォルト)
変更前後の差分確認
rem 2つのキーの差分を確認(変更前 vs 変更後)
reg compare "HKLM\SOFTWARE\MyApp_Before" "HKLM\SOFTWARE\MyApp" /s

rem 差分がなければ ERRORLEVEL=0、差分があれば ERRORLEVEL=1
if %ERRORLEVEL% equ 0 (
    echo 差分なし:設定は同一です
) else (
    echo 差分あり:変更が検出されました
)

rem エクスポート済み .reg と比較する場合は、先に別キーにインポートする
reg import "backup.reg"
rem ※ .reg ファイルと直接比較はできない点に注意

実践テンプレート:アプリ設定を一括投入するキッティングバッチ

新規PCのセットアップや大量展開に使えるキッティングバッチです。複数のアプリ設定を一括でレジストリに書き込み、ログを残します。

kitting.bat — アプリ設定の一括投入
@echo off
setlocal enabledelayedexpansion
cd /d %~dp0

set "LOG=%~dp0kitting_%date:~0,4%%date:~5,2%%date:~8,2%_%time:~0,2%%time:~3,2%.log"
set "ERR_COUNT=0"

rem ===== ログ関数 =====
call :log "=== キッティング開始: %date% %time% ==="
call :log "コンピュータ名: %COMPUTERNAME%"
call :log "ユーザー名  : %USERNAME%"

rem ===== バックアップ =====
call :log "[BACKUP] HKLM\SOFTWARE\MyApp"
reg export "HKLM\SOFTWARE\MyApp" "backup\MyApp_before.reg" /y 2>nul

rem ===== アプリAの設定 =====
call :log "[SET] AppA: InstallPath"
call :reg_add "HKLM\SOFTWARE\AppA" "InstallPath" REG_SZ "C:\Apps\AppA"

call :log "[SET] AppA: MaxRetry"
call :reg_add "HKLM\SOFTWARE\AppA" "MaxRetry" REG_DWORD 3

call :log "[SET] AppA: ServerUrl"
call :reg_add "HKLM\SOFTWARE\AppA" "ServerUrl" REG_SZ "https://server.example.com"

rem ===== アプリBの設定 =====
call :log "[SET] AppB: DataDir"
call :reg_add "HKLM\SOFTWARE\AppB" "DataDir" REG_EXPAND_SZ "%ProgramData%\AppB"

rem ===== 結果サマリ =====
call :log "=== 完了: エラー数 !ERR_COUNT! ==="
if !ERR_COUNT! gtr 0 (
    echo キッティング完了(エラー !ERR_COUNT! 件。ログを確認してください)
    exit /b 1
)
echo キッティング完了(エラーなし)
exit /b 0

rem ===== サブルーチン =====
:reg_add
reg add %~1 /v %~2 /t %~3 /d %~4 /f >nul 2>&1
if %ERRORLEVEL% neq 0 (
    call :log "[ERROR] 書き込み失敗: %~1 /v %~2"
    set /a ERR_COUNT+=1
)
exit /b 0

:log
echo [%time%] %~1
echo [%time%] %~1 >> "%LOG%"
exit /b 0

実践テンプレート:セキュリティ設定を強化するバッチ

UAC・Windows Defender・RDP などのセキュリティ関連レジストリ設定を一括で適用するテンプレートです。

注意:以下のバッチは管理者権限が必要です。設定変更前にシステムのバックアップを取得してください。環境によっては業務アプリの動作に影響する場合があります。テスト環境で十分に検証してから本番環境に適用してください。

security-hardening.bat — セキュリティ強化設定
@echo off
setlocal

rem 管理者権限チェック
net session >nul 2>&1
if %ERRORLEVEL% neq 0 (
    echo エラー: 管理者権限で実行してください
    pause
    exit /b 1
)

echo [1/5] バックアップ中...
if not exist "backup" mkdir backup
reg export "HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies" "backup\policies_before.reg" /y

echo [2/5] UAC 設定強化...
rem UAC を有効化(0=無効 / 1=有効)
reg add "HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System" /v EnableLUA /t REG_DWORD /d 1 /f
rem 管理者承認モード
reg add "HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System" /v ConsentPromptBehaviorAdmin /t REG_DWORD /d 2 /f
rem 標準ユーザーのプロンプト(2=認証確認)
reg add "HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System" /v ConsentPromptBehaviorUser /t REG_DWORD /d 0 /f

echo [3/5] RDP 設定...
rem RDP を無効化(セキュリティ要件がなければ無効推奨)
reg add "HKLM\SYSTEM\CurrentControlSet\Control\Terminal Server" /v fDenyTSConnections /t REG_DWORD /d 1 /f
rem NLA(ネットワークレベル認証)を強制
reg add "HKLM\SYSTEM\CurrentControlSet\Control\Terminal Server\WinStations\RDP-Tcp" /v UserAuthentication /t REG_DWORD /d 1 /f

echo [4/5] Windows Defender 設定...
rem リアルタイム保護を有効化(0=有効)
reg add "HKLM\SOFTWARE\Microsoft\Windows Defender\Real-Time Protection" /v DisableRealtimeMonitoring /t REG_DWORD /d 0 /f
rem クラウド保護を有効化
reg add "HKLM\SOFTWARE\Microsoft\Windows Defender\Spynet" /v SpynetReporting /t REG_DWORD /d 2 /f

echo [5/5] 自動実行(Autorun)無効化...
reg add "HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\Explorer" /v NoDriveTypeAutoRun /t REG_DWORD /d 255 /f

echo.
echo セキュリティ設定の適用が完了しました。
echo 一部の設定を有効にするには再起動が必要です。
exit /b 0

実践テンプレート:設定変更を自動検証・ロールバックするバッチ

設定を変更した後、期待値と一致するかを自動検証し、不一致であれば自動的にロールバックする堅牢なテンプレートです。

apply-and-verify.bat — 変更・検証・ロールバック
@echo off
setlocal enabledelayedexpansion
cd /d %~dp0

set "REG_KEY=HKLM\SOFTWARE\MyApp"
set "BACKUP=backup\before_change.reg"
set "ERR=0"

if not exist backup mkdir backup

rem ===== STEP 1: バックアップ =====
echo [STEP1] バックアップ取得...
reg export "%REG_KEY%" "%BACKUP%" /y 2>nul
if %ERRORLEVEL% neq 0 (
    echo 警告: バックアップ取得失敗(キーが存在しない可能性)
)

rem ===== STEP 2: 設定変更 =====
echo [STEP2] 設定変更中...
reg add "%REG_KEY%" /v Feature1 /t REG_DWORD /d 1 /f
reg add "%REG_KEY%" /v Feature2 /t REG_SZ /d "enabled" /f
reg add "%REG_KEY%" /v MaxConnections /t REG_DWORD /d 10 /f

rem ===== STEP 3: 検証 =====
echo [STEP3] 設定検証中...

rem Feature1 の検証
call :verify "%REG_KEY%" Feature1 "0x1"

rem Feature2 の検証
call :verify "%REG_KEY%" Feature2 "enabled"

rem MaxConnections の検証
call :verify "%REG_KEY%" MaxConnections "0xa"

rem ===== STEP 4: 結果判定 =====
if !ERR! gtr 0 (
    echo [ROLLBACK] 検証失敗 !ERR! 件。ロールバックします...
    if exist "%BACKUP%" (
        reg import "%BACKUP%"
        echo ロールバック完了
    ) else (
        echo 警告: バックアップファイルがないためロールバック不可
    )
    exit /b 1
)

echo [OK] すべての検証が成功しました
exit /b 0

rem ===== サブルーチン: 検証 =====
:verify
set "V_KEY=%~1"
set "V_NAME=%~2"
set "V_EXPECT=%~3"
set "V_ACTUAL="

for /f "tokens=2,*" %%A in (
    'reg query "%V_KEY%" /v %V_NAME% 2^>nul'
) do set "V_ACTUAL=%%B"

if "%V_ACTUAL%"=="%V_EXPECT%" (
    echo   OK: %V_NAME% = %V_ACTUAL%
) else (
    echo   NG: %V_NAME% 期待値=%V_EXPECT% 実際=%V_ACTUAL%
    set /a ERR+=1
)
exit /b 0

このテンプレートの特徴

  • 変更前に自動バックアップを取得するため、ロールバックが確実
  • 検証ステップで期待値との照合を行い、人的ミスを早期に検出
  • 複数の検証失敗を集計して一括ロールバックするため、中途半端な状態になりにくい
  • サブルーチン化により、検証項目の追加が容易

トラブルシューティング

症状・エラー 原因 対処法
「アクセスが拒否されました」 管理者権限なし、または HKLM へのアクセス制限 管理者としてコマンドプロンプトを実行する
「指定されたレジストリキーが見つかりません」 キーパスのタイポ、または親キーが存在しない reg add は親キーも自動作成する。キーパスを再確認
書き込んだはずの値が見当たらない 32bit/64bitビューの不一致(WOW6432Node 問題) /reg:32 または /reg:64 を明示指定する
バッチが確認待ちで止まる reg add / reg delete に /f を付けていない すべての reg add / reg delete に /f を付ける
for /f で値が取得できない(変数が空) 値が存在しない、またはトークン指定が合っていない 2>nul で確認し、tokens=2,* に変更して試す
DWORD 値の比較がうまくいかない reg query の出力が “0x1” など16進数になる “0x1” と比較するか、/t REG_DWORD で出力を確認
reg export が失敗する 対象キーが存在しない、または書き込み先に権限がない キーの存在をあらかじめ reg query で確認する
reg import 後も設定が反映されない サービス・アプリが設定をキャッシュしている 対象サービスを再起動、またはPCを再起動する
タスクスケジューラからだと書き込みが失敗 タスクが管理者権限で動いていない タスクの設定で「最上位の特権で実行する」にチェック
REG_MULTI_SZ が正しく書き込めない null文字(\0)をコマンドラインで表現できない /s で代替区切り文字を指定するか、.reg ファイルで管理

まとめ

バッチファイルから reg コマンドを使ってレジストリを操作する方法を解説しました。

コマンド 用途 重要ポイント
reg add 値の書き込み・キー作成 必ず /f を付けてバッチ停止を防ぐ
reg query 値の読み取り・存在確認 2>nul でエラー出力を抑止、for /f で変数に格納
reg delete 値・キーの削除 削除前に必ず reg export でバックアップ
reg export バックアップ(.reg ファイル) 変更前の必須手順。/y で上書き確認を省略
reg import リストア 管理者権限が必要。再起動が必要な場合あり
reg compare 差分確認 ERRORLEVEL=0 なら一致、1 なら差分あり

安全なレジストリ操作のためのチェックリスト

  • 変更前に reg export でバックアップを取得する
  • reg add / reg delete には必ず /f を付ける
  • HKLM の書き込みは管理者権限で実行する
  • 32bit/64bitビューの不一致を防ぐため /reg:32 / /reg:64 を明示指定する
  • 変更後は reg query または reg compare で設定を検証する
  • テスト環境で動作確認してから本番環境に適用する

あわせて読みたい