Проблема с пакетным файлом Errorlevel

Я нахожусь в Windows 7 Enterprise и вызываю банку из пакетного файла, который возвращает 0, 1 или 2 в зависимости от условия, я использовал «System.exit» для того же,

ниже мой пакетный скрипт

@echo off

java -jar "test.jar" %*
set exitcode=%ERRORLEVEL%
echo here is 1st exit code %exitcode%
if %exitcode% == 2 (    
        VERIFY > nul
        set exitcode=%ERRORLEVEL%
        echo here is 2nd exit code after VERIFY %exitcode%
        call test.exe %*
        echo here is 2nd exit code %ERRORLEVEL% 

    if %ERRORLEVEL% == 0    (
           cmd /c "exit /b 0"
           call test1.exe -f
           echo here is 3rd exit code %errorlevel%
    )
)exit /b %errorlevel%

Что я делаю в приведенном выше коде, так это вызываю jar и в зависимости от уровня ошибки, который он возвращает, я вызываю другой exe и снова, в зависимости от уровня ошибки этого exe, я вызываю третий exe. Проблема в том, что код выхода, который я получаю, является первым назначенным кодом выхода, т. Е. Если test.jar существует с 2, даже после успешного выполнения других exes уровень ошибки не изменяется. И третий exe никогда не выполняется. Пробовал разные подходы к вызову

cmd выход /b 0

для сброса уровня ошибки до 0, но он не работает.


person Rahul Borkar    schedule 19.07.2012    source источник


Ответы (2)


Ваша проблема в том, что cmd расширяет переменные среды сразу же после анализа оператора, а не при его выполнении. Оператор в этом смысле включает все if, включая блоки. Вам нужно использовать отложенное расширение, поэтому в начале партии вставьте следующее:

setlocal enabledelayedexpansion

а затем используйте !errorlevel! вместо %errorlevel% в условном операторе (аналогично для exitcode).

person Joey    schedule 19.07.2012

Когда достигается ваш первый оператор IF, все вхождения %ERRORLEVEL% заменяются тем, чем оно является в настоящее время (то же, что и 1-й код выхода).

Используйте !ERRORLEVEL! и/или !EXITCODE! чтобы получить отложенное расширение, чтобы эти переменные были расширены позже с актуальными значениями.

Это требует, чтобы вы добавили setlocal enabledelayedexpansion вверху вашего скрипта.

Eg

@echo off
setlocal enabledelayedexpansion
set FOO=foo
echo %FOO%
if 1==1 (
   set FOO=bar
   echo %FOO%
   echo !FOO!
)

Производит:

foo
foo
bar
person azhrei    schedule 19.07.2012