带有或不带有错误级别的 Windows 批处理退出选项 b

jwc*_*hoi 5 windows batch-file errorlevel

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

我在谷歌上引用了TechNet(Exit)和许多示例。

他们中的大多数人像这样使用 /b 和 %errorlevel%

if errorlevel 1 exit /b %errorlevel%
Run Code Online (Sandbox Code Playgroud)

我想知道两者之间的区别

if errorlevel 1 exit /b
Run Code Online (Sandbox Code Playgroud)

if errorlevel 1 exit /b %errorlevel%
Run Code Online (Sandbox Code Playgroud)

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

Jon*_*Jon 5

TL; 博士

大多数情况下应该没有区别,但从技术上讲,exit /b %errorlevel%这比exit /b您想要退出而不更改错误级别更糟糕。

分析

EXIT /B没有可选的 errorlevel 参数不会改变错误级别,所以作为一个独立的命令,它完全等同于EXIT /B %errorlevel% 提供%errorlevel%解决当前错误级别

但在某些情况下它可能不会这样做:

  • 如果ERRORLEVEL定义了命名的环境变量,则%errorlevel%始终解析为其值(可以是任意的),而不是当前的错误级别。
  • 如果命令扩展被禁用,那么%errorlevel%将永远不会解析到当前的错误级别(它仍然会读取具有该名称的环境变量的值,如果已定义)。您可以通过使用CMD /E:OFF并尝试启动命令提示符来验证这一点ECHO %errorlevel%
  • 产生的当前错误级别值%errorlevel%将在解析命令时固定,而不是在执行到达该表达式时固定。这可能会导致为更复杂的命令生成错误的值。例子:

    copy j:\not_existing q:\not_existing & echo %errorlevel%
    
    Run Code Online (Sandbox Code Playgroud)

    这不会产生与

    copy j:\not_existing q:\not_existing
    echo %errorlevel%
    
    Run Code Online (Sandbox Code Playgroud)

    因为在第一种情况下%errorlevel%不会产生由失败导致的更新错误级别copy