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

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

34 голосов
/ 06 декабря 2010

Просто наткнулся на странную вещь с %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 \ work> test.bat
OUTSIDE_IF 1
'ThisWillSetErrorLevelTo9009ieNotRecognizedCommand' не распознан как внутренняя или внешняя команда, работающая программа или пакетный файл.
OUTSIDE_IF 1
'ThisWillSetErrorLevelTo9009 не распознается как внешняя операционная команда или не является операционной системойили пакетный файл.
INSIDE_IF ERRORLEVEL 9009
INSIDE_IF2 ERRORLEVEL GREQ 1 9009
OUTSIDE_IF ERRORLEVEL 1

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

1 Ответ

41 голосов
/ 06 декабря 2010

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

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