如果存在以下行,则未设置 Windows 批处理文件返回代码



以下名为"foo.bat"的Windows批处理文件回显"quitting",并将返回代码设置为1,如我预期的那样:

if "1"=="1" (
if "1"=="1" (
echo quitting
exit /B 1
)
)

但是,令我惊讶的是,这个批处理文件的返回代码是 0:

if "1"=="1" (
if "1"=="1" (
echo quitting
exit /B 1
)
echo anything
)

我在Windows命令提示符下确定批处理文件的返回代码:

> cmd.exe /c foo.bat
quitting
> echo %ERRORLEVEL%
0

我已经验证了尚未在我的环境中设置错误级别,运行set ERRORLEVEL按预期打印"环境变量错误级别未定义"。

有关第二个文件的其他所有内容都按预期工作。它确实回响了"退出",而不是回响"任何东西"。似乎将echo anything行添加到脚本意味着该行仍exit /B 1退出但不设置返回代码。

这是EC2中的Windows 7。ver报告"Microsoft Windows [版本 6.1.7601]"。

有没有办法确保exit /B 1真正设置返回代码,即使在复杂的 if 语句中也是如此?

如果我将文件扩展名从".bat"更改为".cmd",那么它的行为会按预期运行。

您的测试环境是什么? 你舒尔没有其他副作用吗?

这批产品在Win7Ult和Win10pro中获得了预期的结果

@Echo off&SetLocal EnableExtensions EnableDelayedExpansion
ver > nul
Call :First 
Echo called First  ErrorLevel = %Errorlevel%
ver > nul
Call :Second
Echo called Second ErrorLevel = %Errorlevel%
Pause
Goto:Eof
:First
if "1"=="1" (
if "1"=="1" (
echo quitting
exit /B 1
)
)
Goto :EoF
:Second
if "1"=="1" (
if "1"=="1" (
echo quitting
exit /B 1
)
echo anything
)

quitting
called First  ErrorLevel = 1
quitting
called Second ErrorLevel = 1

我遇到了同样的麻烦。我用这样的东西解决了它:

if "1"=="1" (
if "1"=="1" (
echo quitting
goto Exit1
)
echo anything
)
goto :Eof
:Exit1
exit /b 1

另一个"已知"的缺陷是:

rem t.bat
copy non-existing somewhere
rem
C:> cmd /c t.bat
The system cannot find the file specified.
C:> echo %errorlevel%
0

如果后面有注释(或回显或通常不会更改错误级别的东西(,则在使用 cmd/c 运行时,在批处理文件末尾显式返回错误级别不起作用。所以需要改用这个:

rem t.bat
copy non-existing somewhere
exit /b %errorlevel%
rem
C:> cmd /c t.bat
The system cannot find the file specified.
C:> echo %errorlevel%
1

最新更新