我有 a.bat ,它有一个 variable %errorlevel%
,下面的行调用 b.bat:
start /wait cmd /c b.bat
如果b.bat
设置%errorlevel%
(例如errorlevel = 5
)
我怎么可能只保留这个%errorlevel%
变量a.bat
,而不使用 CALL 命令。
我不想使用 CALL 的原因是因为b.bat
包含一些我不想保留的变量。
我有 a.bat ,它有一个 variable %errorlevel%
,下面的行调用 b.bat:
start /wait cmd /c b.bat
如果b.bat
设置%errorlevel%
(例如errorlevel = 5
)
我怎么可能只保留这个%errorlevel%
变量a.bat
,而不使用 CALL 命令。
我不想使用 CALL 的原因是因为b.bat
包含一些我不想保留的变量。
自最初发布以来,此答案已被大量编辑。
您的命令应该按照当前编写的方式运行,尽管我认为使用 START 没有任何优势。简单地使用会更简单,更有效:
cmd /c "b.bat"
由 b.bat 设置的 ERRORLEVEL 应该由 CMD 命令返回。当然,如果您创建了自己的名为 ERRORLEVEL 的环境变量来掩盖 Windows 维护的动态值,那么这将不起作用。
但是,我认为(如果可能)修改 b.bat 使其SETLOCAL
位于顶部会更好。b.bat 定义的任何变量都是临时的,一旦脚本结束就会被遗忘。然后您可以使用 CALL 并且 b.bat 中的变量将消失,但将为调用者正确设置 ERRORLEVEL。
b.bat
@echo off
setlocal
set var=This value will be "forgotten" when b.bat ends
dir "This does not exist so ERRORLEVEL will be set to 1"
调用者.bat
@echo off
set var=
call b.bat
echo ERRORLEVEL=%errorlevel%
set var
但是根据您的评论,听起来好像您在 b.bat 中有一行,如下所示:
set errorlelvel=%errorsaved%
你永远不应该像那样为 ERRORLEVEL 定义自己的值,因为它破坏了 ERRORLEVEL 应该用于的功能。
相反,您应该使用 EXIT /B 在脚本末尾设置错误级别
@echo off
setlocal
...
set someVar=anything. This value will be gone at script end because of SETLOCAL
...
someCommandThatGeneratesAnError
set errorsaved=%errorlevel%
...
exit /b %errosaved%
如果您尝试从 b.bat (而不是 ERRORLEVEL)有选择地保留用户定义的变量,那么您确实应该修改 b.bat 以使其SETLOCAL
位于顶部,然后ENDLOCAL
与多种方法中的任何一种结合使用来保留值跨越 ENDLOCAL 障碍。查看使环境变量在 ENDLOCAL 中存活的前 3 个投票答案
您不必公开内部变量即可在脚本之间进行通信。您可以使用常规参数将值发送到被调用脚本并从%ERRORLEVEL%
环境变量中获取其数值结果。在以下示例中,a.cmd
将参数传递给b.cmd
并接收其执行结果(来自%ERRORLEVEL%
):
:: a.cmd ----
SETLOCAL
SET ARGUMENT=123
CALL b.cmd "%ARGUMENT%"
SET RESULT=%ERRORLEVEL%
ECHO B returned this numeric value as result (%RESULT%)
:: b.cmd ----
SETLOCAL
SET OTHERVAR=%~1
ECHO B received this value as argument (%OTHERVAR%)
EXIT /B 33000
我加强了避免对变量使用保留名称的建议(正如@dbenham 也评论的那样)。