为什么“echo”的返回值始终为1

时间:2013-12-25 08:37:22

标签: windows batch-file cmd

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

3 个答案:

答案 0 :(得分:4)

是的,echo something对错误级别没有任何影响,并且不会将errorlevel更改为0,因为这只会一直成功。

例如:

运行echo something > c:\somefile.txt,它将成功实际创建文件,但不会将errorlevel更改为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

答案 1 :(得分:3)

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

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

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

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

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

答案 2 :(得分:2)

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

echo命令有效时

如果echo之前的错误级别为0,则在echo之后,errorlevel将为0(显而易见的情况)

如果在echo之前错误级别为1,则在echo之后,errorlevel将为1. Echo不会更改错误级别

echo命令“失败”时

可以回声失败吗?让我们创建一个“失败”的案例。在同一目录中打开两个命令窗口。在第一个运行pause > file.txt以生成文件并在暂停命令等待按键时对其进行锁定。在第二个命令窗口中运行echo something > file.txt。在这种情况下,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

capture of test on errorlevel