我是在 Windows 上使用批处理的新手,并且对错误级别的使用有疑问。
我引用了TechNet(退出)以及谷歌上的许多示例。
大多数人都像这样使用 /b 和 %errorlevel%
if errorlevel 1 exit /b %errorlevel%
我想知道之间的区别
if errorlevel 1 exit /b
和
if errorlevel 1 exit /b %errorlevel%
我认为没有区别,因为 %errorlevel% 没有改变。难道我错了?
大多数时候应该没有区别,但从技术上讲,如果您想要退出而不更改错误级别,则
exit /b %errorlevel%
严格比exit /b
差。
EXIT /B
不会更改错误级别,因此作为独立命令,它完全等同于 EXIT /B %errorlevel%
,前提是 %errorlevel%
解析为当前错误级别。
但在某些情况下可能不会这样做:
ERRORLEVEL
的环境变量,则 %errorlevel%
始终解析为其值(可以是任意的),而不是当前错误级别。%errorlevel%
将永远不会解析为当前错误级别(它仍会读取具有该名称的环境变量的值(如果已定义))。您可以通过使用 CMD /E:OFF
启动命令提示符并尝试 ECHO %errorlevel%
来验证这一点。由
%errorlevel%
生成的当前错误级别值将在解析命令时固定,而不是在执行到达该表达式时固定。这可能会导致为更复杂的命令生成错误的值。示例:
copy j:\not_existing q:\not_existing & echo %errorlevel%
这不会产生与
相同的结果copy j:\not_existing q:\not_existing
echo %errorlevel%
因为在第一种情况下
%errorlevel%
不会产生由失败的copy
导致的更新的错误级别。不幸的是,似乎
cmd /B
并不总是像您期望的 cmd /B %ERRORLEVEL%
那样工作。如果您位于批处理文件的最顶层,则两个命令都会关闭 cmd.exe
(假设它配置为关闭),但 cmd /B
不会将错误级别转换为其返回代码。
示例:
测试.cmd:
@echo off
cmd /C "exit /B 1"
echo %ERRORLEVEL%
exit /B
运行:
> cmd /C "test.cmd"
1
> echo %ERRORLEVEL%
0
同时
cmd /B %ERRORLEVEL%
设置返回代码就好了。
不幸的是,这使得
cmd /B
对于可以称为独立的批处理文件(计划任务和其他类似的东西)来说不可靠。