【问题标题】:Windows batch exit option b with or without errorlevelWindows 批处理退出选项 b 有或没有错误级别
【发布时间】:2014-06-11 08:59:27
【问题描述】:

我是在 Windows 上使用批处理的新手,对错误级别的使用有疑问。

我参考了TechNet(Exit) 和google上的很多例子。

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

if errorlevel 1 exit /b %errorlevel%

我想知道两者的区别

if errorlevel 1 exit /b

if errorlevel 1 exit /b %errorlevel%

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

【问题讨论】:

    标签: windows batch-file errorlevel


    【解决方案1】:

    TL;DR

    大多数时候应该没有区别,但从技术上讲,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%
      

      这不会产生与

      相同的结果
      copy j:\not_existing q:\not_existing
      echo %errorlevel%
      

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

    【讨论】:

    • 最后一项可以通过使用copy j:\not_existing q:\not_existing & echo !errorlevel!启用和应用delayed variable expansion来解决...
    【解决方案2】:

    您的代码没有任何意义。他们都不做任何事情。

    键入

    if /?
    

    exit /?
    

    我已通过将 errorlevel 更改为 0 来更改您的代码以运行。这是输出。

    C:\Users\user>if errorlevel 0 /b 0
    '/b' is not recognized as an internal or external command,
    operable program or batch file.
    
    C:\Users\user>if errorlevel 0 /b
    '/b' is not recognized as an internal or external command,
    operable program or batch file.
    
    C:\Users\user>if errorlevel 0 /b 9009
    '/b' is not recognized as an internal or external command,
    operable program or batch file.
    

    也许你可以学习规则而不是搜索互联网。

    【讨论】:

    • 现在有人编辑了您的问题,%errorlevel% 在读取该行时扩展。您对错误级别所做的任何更改都不会影响该行。
    • 我编辑了问题;很明显,我们在这里谈论的是exit /b(例如,这就是 TechNet 文章的内容)。
    • if errorlevel <num>if %errorlevel%=<num> 不同。您永远不要使用 %errorlevel% 代替 if errorlevel。大多数时候它的工作原理是一样的。正如另一位海报指出的那样,它并不总是相同的。即使没有改变,行为也会有细微的差别。
    • 我使用的命令只是批处理命令的一部分。我知道单独使用“if”或“exit”是没有意义的。一定有其他一些命令会影响“%errorlevel%”。
    • 抱歉,这个“答案”对讨论没有任何帮助,并且通过告诉他们“阅读规则”来贬低新手(对 SO 和批处理主题)并没有似乎没有帮助。显然,他们已经进行了一些研究,正如他们的 techNet 链接(包括“/?”帮助参数)所证明的那样,并且对文章或命令行帮助未涵盖的行为提出了合理的问题。 -1
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-16
    • 2015-01-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多