将错误级别从子批次传递到父批次

将错误级别从子批次传递到父批次

父 .bat

@echo off
SETLOCAL

set errorlevel=2

start /wait child.bat
echo %errorlevel%

子.bat

set errorlevel=1
exit %errorlevel%

输出:

2

预期输出:

1

提供的答案这里对我来说不起作用,而且我不明白为什么要使用/b并保持 cmd 打开。

答案1

不不不,永远不要使用 SET 为 ERRORLEVEL 分配您自己的值。

问题是 ERRORLEVEL 通常不是真正的环境变量。它是一个动态伪环境值,反映了最近返回的 ERRORLEVEL。但是,如果您使用 SET 定义自己的真实 ERRORLEVEL 环境变量,则将%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

相关内容