Windows批处理退出选项b,无论错误级别如何。

91 浏览
0 Comments

Windows批处理退出选项b,无论错误级别如何。

我是在Windows上使用批处理的新手,对于errorlevel的使用有些疑问。

我参考了TechNet(Exit)和谷歌上的许多示例。

大多数示例都像这样使用/b和%errorlevel%

如果 errorlevel 1 退出/b %errorlevel%

我想知道

如果 errorlevel 1 退出/b

如果 errorlevel 1 退出/b %errorlevel%

之间的区别。

我认为它们没有区别,因为%errorlevel%没有改变。我错了吗?

0
0 Comments

TL;DR

大多数情况下,这两个选项没有区别,但从技术上讲,如果你想要退出而不改变错误级别,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而导致的更新错误级别。

最后一个问题可以通过启用和应用延迟变量扩展来解决,使用copy j:\not_existing q:\not_existing & echo !errorlevel!...

0