ОШИБКА внутри IF

Просто наткнулся на странную вещь с %ERRORLEVEL% и хотел посмотреть, знает ли кто-нибудь, почему и есть ли способ это исправить. По сути, кажется, что команды выполняются внутри, если операторы не устанавливают %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 \ имя пользователя \Documents\ работа> test.bat
OUTSIDE_IF 1
ThisWillSetErrorLevelTo9009ieNotRecognizedCommand не распознается как внутренняя или внешняя команда, работающая программа или пакетный файл.
OUTSIDE_IF 1
ThisWillSetErrorLevelTo9009ieNotRecognizedCommand не распознается как внутренняя или внешняя команда, работающая программа или пакетный файл.
INSIDE_IF ОШИБКА 9009
INSIDE_IF2 ERRORLEVEL GREQ 1 9009
OUTSIDE_IF ОШИБКА 1

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

1 ответ

Решение

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

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

if errorlevel работает без отложенного расширения, но работает аналогично

if %errorlevel% <= Some_Value ...:

@echo off

::sets errorlevel to 0
(call )
if "1" == "1" (
    rem sets errorlevel to 5
    cmd /c exit 5
    if errorlevel 4 echo this will be printed
    if errorlevel 5 echo this will be printed
    rem :::: you can use this ::::::::::::::
    if errorlevel 5 if not errorlevel 6 echo this will be printed ONLY when the errorlevel is 5
    rem :::::::::::::::::::::::::::::::::::::
    if errorlevel 6 echo this will not be printed

)
Другие вопросы по тегам