web-dev-qa-db-ja.com

IF内のERRORLEVEL

%ERRORLEVEL%で奇妙なことに偶然遭遇し、誰かがその理由を知っているかどうか、そしてそれを修正する方法があるかどうかを確認したいと思っていました。基本的に、ifステートメントが%ERRORLEVEL%変数を設定しない場合、コマンドはifコマンドの内部で実行されているように見えます。 ERRORLEVELIF ERRORLEVEL 1とは異なり、IF %ERRORLEVEL% EQU 1とは異なります)チェックはまだ正常に機能しているように見えるので、おそらく回避できますが、エラーレベルを出力できます。デバッグ用など。

@echo off
Set TESTVAR=1

tasklist | find /I "IsntRunning.exe" > NUL
echo OUTSIDE_IF %ERRORLEVEL%

ThisWillSetErrorLevelTo9009ieNotRecognizedCommand

tasklist | find /I "IsntRunning.exe" > NUL
echo OUTSIDE_IF %ERRORLEVEL%

ThisWillSetErrorLevelTo9009ieNotRecognizedCommand

IF %TESTVAR% EQU 1 (
    Set ERRORLEVEL=
    tasklist | find /I "IsntRunning.exe" > NUL
    echo INSIDE_IF  ERRORLEVEL %ERRORLEVEL%

    IF ERRORLEVEL 1 (
        echo INSIDE_IF2  ERRORLEVEL GREQ 1 %ERRORLEVEL%
    )
    IF ERRORLEVEL 2 (
        echo INSIDE_IF2  ERRORLEVEL GREQ 2 %ERRORLEVEL%
    )
    IF ERRORLEVEL 3 (
        echo INSIDE_IF2  ERRORLEVEL GREQ 3 %ERRORLEVEL%
    )
)

tasklist | find /I "IsntRunning.exe" > NUL
echo OUTSIDE_IF ERRORLEVEL %ERRORLEVEL%

@echo on

それをバッチファイルに入れて実行すると、次の出力が生成されます。

C:\ Users\username\Documents\work> test.bat
OUTSIDE_IF 1
'ThisWillSetErrorLevelTo9009ieNotRecognizedCommand'は、内部または外部のコマンド、操作可能なプログラム、またはバッチファイルとして認識されません。
OUTSIDE_IF 1
'ThisWillSetErrorLevelTo9009ieNotRecognizedCommand'は、内部または外部のコマンド、操作可能なプログラム、またはバッチファイルとして認識されません。
INSIDE_IF ERRORLEVEL 9009
INSIDE_IF2 ERRORLEVEL GREQ 1 9009
OUTSIDE_IF ERRORLEVEL 1

関連記事:

35
Srekel

バッチファイルの先頭でsetlocal enabledelayedexpansionを使用し、IF内で!ERRORLEVEL!を使用してみてください。これは私にとってはうまくいくようです:

@echo off
setlocal enabledelayedexpansion
dir nul
echo %ERRORLEVEL%
if .1.==.1. (
  urklbkrlksdj - not a command
  echo %ERRORLEVEL%
  echo !ERRORLEVEL!
)
43
Jim Davis