【发布时间】:2013-12-25 08:37:21
【问题描述】:
调用 CMD "echo xxx" 后,%errorlevel% 始终为 1。 即使“echo xxx”执行成功。
【问题讨论】:
-
%errorlevel%在echo之前已经是 1 了吗? -
是的,echo好像没有影响%errorlevel%?
标签: windows batch-file cmd
调用 CMD "echo xxx" 后,%errorlevel% 始终为 1。 即使“echo xxx”执行成功。
【问题讨论】:
%errorlevel% 在 echo 之前已经是 1 了吗?
标签: windows batch-file cmd
是的,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
【讨论】:
像 FINDSTR 和 XCOPY 这样的外部命令实际上是独立的程序(FINDSTR.EXE、XCOPY.EXE)。外部命令在成功和失败时设置 ERRORLEVEL。按照惯例,0 表示成功,非零表示错误。但有些程序可能不遵循该约定。
ECHO 是一个内部命令,这意味着该命令内置在 CMD.EXE 程序本身中。不需要额外的程序。内部命令的行为不同。
如果在命令行上使用,或者在带有 .BAT 扩展名的批处理脚本中使用,那么大多数内部命令会在失败时设置 ERRORLEVEL,但在成功时不会对 ERRORLEVEL 执行任何操作。但是,也有一些例外。 VER 和 VOL 都会在成功时将 ERRORLEVEL 设置为 0。
在带有 .CMD 扩展名的批处理脚本中使用时,所有内部命令都会在成功和失败时设置 ERRORLEVEL,就像外部命令一样。
您在 ECHO 之后看到的 ERRORLEVEL 1 一定来自先前失败的命令。我从未见过 ECHO 失败。我可以想象它可能失败的唯一方法是如果标准输出成功重定向到文件,但由于某种原因(例如设备已满)无法写入存储设备。
【讨论】:
vol 或 ver 命令重置错误级别。在 .cmd 中也是如此
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
【讨论】:
ve included a capture of my screen on test of errorlevel. For me the errorlevel changes. Are you testing the %errorlevel%`变量值直接使用if errorlevel构造?