Подтвердить что ты не робот

ERRORLEVEL внутри IF

Просто наткнулся на странную вещь с % ERRORLEVEL% и хотел узнать, знает ли кто, почему и если есть способ ее исправить. По сути, кажется, что команды, выполняемые внутри if, не устанавливают переменную % ERRORLEVEL%. ERRORLEVEL (как в IF 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' is not recognized as an internal or external command,
operable program or batch file.
OUTSIDE_IF 1
'ThisWillSetErrorLevelTo9009ieNotRecognizedCommand' is not recognized as an internal or external command,
operable program or batch file.
INSIDE_IF  ERRORLEVEL 9009
INSIDE_IF2  ERRORLEVEL GREQ 1 9009
OUTSIDE_IF ERRORLEVEL 1

Соответствующие статьи:

4b9b3361

Ответ 1

Попробуйте использовать setlocal enabledelayedexpansion в начале вашего командного файла и !ERRORLEVEL! внутри вашего IF. Кажется, это работает для меня:

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