0

我有 a.bat ,它有一个 variable %errorlevel%,下面的行调用 b.bat:

start /wait cmd /c b.bat

如果b.bat设置%errorlevel%(例如errorlevel = 5

我怎么可能只保留这个%errorlevel%变量a.bat,而不使用 CALL 命令。

我不想使用 CALL 的原因是因为b.bat包含一些我不想保留的变量。

4

2 回答 2

1

自最初发布以来,此答案已被大量编辑。

您的命令应该按照当前编写的方式运行,尽管我认为使用 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 个投票答案

于 2012-06-11T14:44:22.753 回答
1

您不必公开内部变量即可在脚本之间进行通信。您可以使用常规参数将值发送到被调用脚本并从%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 也评论的那样)。

于 2012-06-11T14:30:08.730 回答