Batch file 成功后,哪些cmd.exe内部命令将ERRORLEVEL清除为0?
在Windows批处理脚本中处理错误的一种常见方法是使用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清除为
如果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
- 移位
- 开始
- 头衔
- 光盘
- CHDIR
- 颜色
- 抄袭
- 日期
- DEL:始终清除ERRORLEVEL,即使DEL失败(除非在没有任何文件参数的情况下运行)
- 迪尔
- 擦除:始终清除ERRORLEVEL,即使擦除失败。(除非运行时没有任何文件参数)
- 医学博士
- MKDIR
- MKLINK
- 移动
- 推动
- 任
- 改名
- SETLOCAL
- 时间
- 类型
- 弗尔
- 核实
- 卷
.bat
的脚本中发出,则这些命令在成功后不会清除ERRORLEVEL,但是如果从扩展名为.cmd
的脚本发出,则会将ERRORLEVEL清除为0。有关更多信息,请参阅和
- 协会
- DPATH
- F型
- 路径
- 提示
- 设置
- 调用:如果调用:例程或批处理脚本,则ERRORLEVEL由被调用的脚本或:例程独占控制。但是,如果被调用的命令没有进行其他设置,则任何其他类型的成功命令调用都会将ERRORLEVEL清除为0。
示例:调用echo OK
- 退出:如果不使用
,则cmd.exe会话终止,不再有错误级别,只有cmd.exe返回代码。显然,/B
会将ERRORLEVEL清除为0,但是没有值的EXIT/b0
会保留先前的ERRORLEVELEXIT/b0
我相信这是所有内部命令的原因,除非我遗漏了一个未记录的命令。您对
调用命令的描述不完整:
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