2

Родитель .bat

@echo off
SETLOCAL

set errorlevel=2

start /wait child.bat
echo %errorlevel%

Ребенок .bat

set errorlevel=1
exit %errorlevel%

Выход:

2

Ожидаемый результат:

1

Ответ, приведенный здесь , не работает для меня, также я не понимаю, почему вы используете /b и оставляете cmd открытым.

1 ответ1

3

Нет Нет Нет, никогда не используйте SET, чтобы присвоить собственное значение ERRORLEVEL.

Проблема в том, что ERRORLEVEL обычно не является истинной переменной среды. Это динамическое значение псевдо-среды, которое отражает самую последнюю возвращаемую ошибку ERRORLEVEL. Но если вы определяете свою собственную истинную переменную среды ERRORLEVEL с помощью SET, то %ERRORLEVEL% всегда будет возвращать назначенное вами значение, а не требуемое динамическое значение.

Это поведение описано в справочной системе. Если вы введете set /? или help set из командной строки, затем в конце выводится следующее:

If Command Extensions are enabled, then there are several dynamic
environment variables that can be expanded but which don't show up in
the list of variables displayed by SET.  These variable values are
computed dynamically each time the value of the variable is expanded.
If the user explicitly defines a variable with one of these names, then
that definition will override the dynamic one described below:

%CD% - expands to the current directory string.

%DATE% - expands to current date using same format as DATE command.

%TIME% - expands to current time using same format as TIME command.

%RANDOM% - expands to a random decimal number between 0 and 32767.

%ERRORLEVEL% - expands to the current ERRORLEVEL value

%CMDEXTVERSION% - expands to the current Command Processor Extensions
    version number.

%CMDCMDLINE% - expands to the original command line that invoked the
    Command Processor.

%HIGHESTNUMANODENUMBER% - expands to the highest NUMA node number
    on this machine.

Если вы хотите определить переменную для хранения кода ошибки, который впоследствии будет использоваться EXIT или EXIT /B, используйте другое имя. Мне нравится использовать ERR.

Если вы когда-либо обнаружите, что кто-то по ошибке определил ERRORLEVEL, вы можете очистить его и восстановить нужные функции, используя set "errorlevel=" .

Если вы хотите явно установить для ERRORLEVEL определенное значение без вызова подпрограммы, вы можете использовать один из следующих методов:

Установите значение 0: (call )

Установите значение 1: (call)

Установите значение на любое число (я буду использовать 56): cmd /c exit 56

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .