Windows 批量退出选项 b,带或不带错误级别

问题描述 投票:0回答:2

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

我引用了TechNet(退出)以及谷歌上的许多示例。

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

if errorlevel 1 exit /b %errorlevel%

我想知道之间的区别

if errorlevel 1 exit /b

if errorlevel 1 exit /b %errorlevel%

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

windows batch-file errorlevel
2个回答
7
投票

TL;博士

大多数时候应该没有区别,但从技术上讲,如果您想要退出而不更改错误级别,则

exit /b %errorlevel%
严格比
exit /b
差。

分析

不带可选 errorlevel 参数的

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
    导致的更新的错误级别。


0
投票

不幸的是,似乎

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
对于可以称为独立的批处理文件(计划任务和其他类似的东西)来说不可靠。

© www.soinside.com 2019 - 2024. All rights reserved.