web-dev-qa-db-ja.com

forループバッチのレジストリキー値の存在を確認しています

レジストリキーの値が存在するかどうかを確認するバッチスクリプトを作成していますが、いくつか問題があります。探すキーを直接指定すると、%ERRORLEVEL%適切に更新します。以下の例は、期待どおりに値1をエコーし​​ます。

REG QUERY HKLM /v NONEXISTENT_KEY
ECHO %ERRORLEVEL%

ただし、ファイル内の一連のキーの存在を確認しているので、FORでループしています。以下は、私が理解できない何らかの理由で0をエコーし​​ます。

FOR /F "tokens=1-2 delims=," %%A IN (myFile.txt) DO (
    REG QUERY "%%A" /v "%%B"
    ECHO %ERRORLEVEL%

注:ループしているファイルの構造は、次の例に示されています。

HKEY_LOCAL_MACHINE\PATH\TO\KEY,SOME VALUE
4
Alex

次のechos 0何らかの理由で私にはわかりません。

FOR /F "tokens=1-2 delims=," %%A IN (myFile.txt) DO (
    REG QUERY "%%A" /v "%%B"
    ECHO %ERRORLEVEL%

EnableDelayedExpansion を一緒に使用し、ECHO !ERRORLEVEL!を使用する必要があります。

修正されたバッチファイル:

@echo off
setlocal enabledelayedexpansion
FOR /F "tokens=1-2 delims=," %%A IN (myFile.txt) DO (
    REG QUERY "%%A" /v "%%B"
    ECHO !ERRORLEVEL!
  )
endlocal

出力:

> type myFile.txt
HKEY_LOCAL_MACHINE\PATH\TO\KEY,SOME VALUE

> test
ERROR: The system was unable to find the specified registry key or value.
1

参考文献

1
DavidPostill