【问题标题】:Why the return value of "echo" is always 1为什么“echo”的返回值总是1
【发布时间】:2013-12-25 08:37:21
【问题描述】:

调用 CMD "echo xxx" 后,%errorlevel% 始终为 1。 即使“echo xxx”执行成功。

【问题讨论】:

标签: windows batch-file cmd


【解决方案1】:

是的,echo something 对错误级别绝对没有影响,并且不会将错误级别更改为 0,因为这将始终成功。

例如:

运行echo something > c:\somefile.txt,它将成功创建文件,但不会将错误级别更改为 0。

c:\>copy nil c:
The system cannot find the file specified.

c:\>echo %errorlevel%
1

c:\>echo this.works > c:\test.txt

c:\>echo %errorlevel%
1

type c:\test.txt
this.works

【讨论】:

    【解决方案2】:

    像 FINDSTR 和 XCOPY 这样的外部命令实际上是独立的程序(FINDSTR.EXE、XCOPY.EXE)。外部命令在成功和失败时设置 ERRORLEVEL。按照惯例,0 表示成功,非零表示错误。但有些程序可能不遵循该约定。

    ECHO 是一个内部命令,这意味着该命令内置在 CMD.EXE 程序本身中。不需要额外的程序。内部命令的行为不同。

    如果在命令行上使用,或者在带有 .BAT 扩展名的批处理脚本中使用,那么大多数内部命令会在失败时设置 ERRORLEVEL,但在成功时不会对 ERRORLEVEL 执行任何操作。但是,也有一些例外。 VER 和 VOL 都会在成功时将 ERRORLEVEL 设置为 0。

    在带有 .CMD 扩展名的批处理脚本中使用时,所有内部命令都会在成功和失败时设置 ERRORLEVEL,就像外部命令一样。

    您在 ECHO 之后看到的 ERRORLEVEL 1 一定来自先前失败的命令。我从未见过 ECHO 失败。我可以想象它可能失败的唯一方法是如果标准输出成功重定向到文件,但由于某种原因(例如设备已满)无法写入存储设备。

    【讨论】:

    • 不确定其他版本(现在我只能在 XP 上测试),但在 .bat 文件中 volver 命令重置错误级别。在 .cmd 中也是如此
    【解决方案3】:

    echo 是一个奇怪的命令。让我们看看它是如何表现的

    echo 命令生效时

    如果echo之前errorlevel为0,echo之后,errorlevel将为0(明显的情况)

    如果echo之前errorlevel为1,echo之后errorlevel将为1。echo不会改变errorlevel

    echo 命令“失败”时

    回显会失败吗?让我们创建一个“失败”的案例。在同一目录中打开两个命令窗口。在第一个运行pause > file.txt 以生成文件并在暂停命令等待按键时对其进行锁定。在第二个命令窗口中运行echo something > file.txt。在这种情况下,echo 命令将失败,因为第一个命令窗口锁定了文件,因此第二个命令窗口无法写入文件。正确地说 echo 并没有失败,但是重定向确实失败了,只是看看会发生什么

    如果errorlevel在运行echo之前为1,则在echo之后仍为1(很明显的情况)

    如果errolevel在运行echo之前为0,则在echo之后仍为0

    所以,看起来 echo 命令在这两种情况下的行为是相同的

    但是如果我们将echo的执行方式更改为

    echo something && echo works || echo fails
    

    然后行为会发生一些变化

    echo 命令生效时

    没有区别。 errorlevel 不会改变,保持运行 echo 命令之前的值。

    echo 命令“失败”时

    使用echo something > file && echo works || echo fails 那么,如果errorlevel 在运行echo 之前为1,则保持其值。

    但是如果errorlevel 为0 并且echo 命令失败,在这种情况下,使用此命令构造,errorlevel 将显示失败并将其值更改为1

    【讨论】:

    • 感谢您的出色回答。但是,如果 errorlevel 为 0,当我尝试命令“echo something > file && echo works || echo failed”时,即使“echo something > file”失败,errorlevel 保持 0,而不是 1。
    • 其实重定向失败是文件被锁定,而不是ECHO命令。重定向发生在执行任何命令之前。如果重定向失败,则永远不会执行命令。如果将带括号的块重定向到锁定的文件,并将多个命令放在括号内,这个概念会更加明显。
    • @dbenham:谢谢,是的,这就是“失败”引用的原因。但我已经更改了关于重定向失败而不是回显失败的评论。
    • @iceKing: Ive included a capture of my screen on test of errorlevel. For me the errorlevel changes. Are you testing the %errorlevel%`变量值直接使用if errorlevel构造?
    猜你喜欢
    • 1970-01-01
    • 2012-06-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-17
    • 2020-08-19
    • 1970-01-01
    • 2014-10-21
    相关资源
    最近更新 更多