Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/batch-file/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Batch file 成功后,哪些cmd.exe内部命令将ERRORLEVEL清除为0?_Batch File_Cmd_Errorlevel - Fatal编程技术网

Batch file 成功后,哪些cmd.exe内部命令将ERRORLEVEL清除为0?

Batch file 成功后,哪些cmd.exe内部命令将ERRORLEVEL清除为0?,batch-file,cmd,errorlevel,Batch File,Cmd,Errorlevel,在Windows批处理脚本中处理错误的一种常见方法是使用 如果errorlevel 1…或如果%errorlevel%neq 0…。通常,人们希望错误处理代码保持错误级别 我相信所有的外部命令都会将ERRORLEVEL设置为某个值,因此错误处理代码必须在执行外部命令之前在环境变量中保留ERRORLEVEL 但是内部命令呢?问题是,一些内部命令成功后会将ERRORLEVEL清除为0,而有些命令则没有。我找不到任何说明哪些命令做什么的文档 因此问题是,哪些内部命令在成功后将ERRORLEVEL清除为

在Windows批处理脚本中处理错误的一种常见方法是使用
如果errorlevel 1…
如果%errorlevel%neq 0…
。通常,人们希望错误处理代码保持错误级别

我相信所有的外部命令都会将ERRORLEVEL设置为某个值,因此错误处理代码必须在执行外部命令之前在环境变量中保留ERRORLEVEL

但是内部命令呢?问题是,一些内部命令成功后会将ERRORLEVEL清除为0,而有些命令则没有。我找不到任何说明哪些命令做什么的文档

因此问题是,哪些内部命令在成功后将ERRORLEVEL清除为0?这不是关于返回的ERRORLEVEL代码的一般问题,而是关于成功结果的严格问题

也有像和这样的帖子给出了部分答案。但我从未见过一份全面的清单

注意:多年来我一直对此很好奇。所以我最终决定进行一系列实验,并得出一个明确的答案。我发布此问答是为了分享我的发现。

此答案基于我在Windows 10下运行的实验。我怀疑与使用cmd.exe的早期Windows版本有什么不同,但这是可能的

另请注意-当内部命令遇到错误时,此答案不会尝试记录ERRORLEVEL结果(除与DEL和ERASE有关的小位)

命令之间不仅存在差异,而且单个命令的行为也可能有所不同,这取决于它是从命令行运行的,还是在扩展名为
.bat
的批处理脚本中运行的,还是在扩展名为
.cmd
的批处理脚本中运行的

无论上下文如何,以下命令集在成功后都不会将ERRORLEVEL清除为0,而是保留先前的ERRORLEVEL:

  • 中断
  • CLS
  • 回音
  • 端部
  • FOR:显然,DO子句中的命令可以设置ERRORLEVEL,但是至少有一次迭代的成功FOR本身不会将ERRORLEVEL设置为0
  • 后藤
  • IF:显然,IF执行的命令可以设置ERRORLEVEL,但是成功的IF本身不会将ERRORLEVEL设置为0
  • 钥匙
  • 停顿
  • 流行音乐
  • 研发部
  • 雷姆
  • RMDIR
  • 移位
  • 开始
  • 头衔
无论上下文如何,下一组命令在成功后总是将ERRORLEVEL清除为0:

  • 光盘
  • CHDIR
  • 颜色
  • 抄袭
  • 日期
  • DEL:始终清除ERRORLEVEL,即使DEL失败(除非在没有任何文件参数的情况下运行)
  • 迪尔
  • 擦除:始终清除ERRORLEVEL,即使擦除失败。(除非运行时没有任何文件参数)
  • 医学博士
  • MKDIR
  • MKLINK
  • 移动
  • 推动
  • 改名
  • SETLOCAL
  • 时间
  • 类型
  • 弗尔
  • 核实
如果从命令行或扩展名为
.bat
的脚本中发出,则这些命令在成功后不会清除ERRORLEVEL,但是如果从扩展名为
.cmd
的脚本发出,则会将ERRORLEVEL清除为0。有关更多信息,请参阅和

  • 协会
  • DPATH
  • F型
  • 路径
  • 提示
  • 设置
最后,有一些命令不适合前面的任何类别:

  • 调用:如果调用:例程或批处理脚本,则ERRORLEVEL由被调用的脚本或:例程独占控制。但是,如果被调用的命令没有进行其他设置,则任何其他类型的成功命令调用都会将ERRORLEVEL清除为0。
    示例:
    调用echo OK

  • 退出:如果不使用
    /B
    ,则cmd.exe会话终止,不再有错误级别,只有cmd.exe返回代码。显然,
    EXIT/b0
    会将ERRORLEVEL清除为0,但是没有值的
    EXIT/b0
    会保留先前的ERRORLEVEL


我相信这是所有内部命令的原因,除非我遗漏了一个未记录的命令。

您对
调用
命令的描述不完整:

CALL:如果被调用的命令没有进行其他设置,则清除ERRORLEVEL。 示例:
调用echo OK

检查这个小示例:

@echo off

call :setTwo
echo Set two: %errorlevel%

call :preserve
echo Preserve: %errorlevel%

call echo Reset
echo Reset: %errorlevel%

call :subNotExists 2> NUL
echo Sub not exist: %errorlevel%

goto :EOF

:setTwo
exit /B 2

:preserve
echo Preserve
exit /B
输出:

Set two: 2
Preserve
Preserve: 2
Reset
Reset: 0
Sub not exist: 1
呼叫
描述应该这样说:

  • CALL:如果被调用的命令没有进行其他设置,则清除ERRORLEVEL。示例:
    调用echo OK
    ,但如果被调用的命令是一个子例程,它将保留先前的错误级别。如果被调用的子例程不存在,它会将ERRORLEVEL设置为1

钥匙
缺失…:)(未清除错误级别)@npocmaka-谢谢,我已将其添加到列表中…只是一个旁注:
rem
在Windows NT 4.0上将
errorlevel
重置为零;据我记忆所及,这一问题自Windows XP以来就得到了解决……我的答案与这个答案并不矛盾,因为这个问题只是关于成功的内部命令结果。您选择有选择地添加有关不成功命令结果的信息。这是有用的信息,但不能回答问题。我想问一个关于内部命令错误处理的一般性问题,但我觉得这个问题太广泛,很难回答。(尽管我希望有朝一日能看到一篇全面的论文!)我也曾考虑过有选择地在我的答案中包含错误结果,但选择了保持它的干净性——严格地说是关于成功的结果。检查一下——我确实让一点错误结果在我的答案中夹杂着我对DEL和ERASE的描述;-)好吧,当subr