调用CMD“echo xxx”后,%errorlevel%始终为1。 即使“echo xxx”成功执行。
答案 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
因此,似乎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