gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 08:14:40 26 4
gpt4 key购买 nike

处理Windows批处理脚本中的错误的常见方法是使用类似if errorlevel 1 ...if %errorlevel% neq 0 ...。通常,人们希望错误处理代码保留ERRORLEVEL。

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

但是内部命令呢?问题是,某些内部命令成功执行后会将ERRORLEVEL清除为0,而某些则不然。而且我找不到任何文档说明哪些命令可以做什么。

因此,问题是,如果成功,哪个内部命令会将ERRORLEVEL清除为0? 这是,而不是,它是有关返回的ERRORLEVEL代码的一般问题,但严格来说是有关成功结果的问题。

What is the easiest way to reset ERRORLEVEL to zero?Windows batch files: .bat vs .cmd?这样的帖子给出了部分答案。但是我从未见过完整的 list 。

注意:我对此一直很好奇。因此,我最终决定进行一堆实验,并得出明确的答案。我正在发布此问答,以分享我发现的内容。

最佳答案

该答案基于我在Windows 10下运行的实验。我怀疑与使用cmd.exe的早期Windows版本是否存在差异,但是有可能。

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

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

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

  • BREAK
  • CLS
  • 回声
  • ENDLOCAL
  • FOR:显然,DO子句中的命令可能会设置ERRORLEVEL,但成功执行FOR且至少进行一次迭代并不会单独将ERRORLEVEL设置为0。
  • GOTO
  • IF:显然,由IF执行的命令可能会设置ERRORLEVEL,但是成功的IF不会单独将ERRORLEVEL设置为0。
  • KEYS
  • 暂停
  • POPD
  • RD
  • REM
  • RMDIR
  • SHIFT
  • START
  • TITLE

  • 无论上下文如何,下一组命令在成功后始终将ERRORLEVEL清除为0:
  • CD
  • CHDIR
  • 颜色
  • COPY
  • DATE
  • DEL:即使DEL失败,也始终清除ERRORLEVEL(除非在没有任何文件参数的情况下运行)。
  • DIR
  • ERASE:即使ERASE失败,也始终清除ERRORLEVEL。 (除非运行时不带任何文件参数)。
  • MD
  • MKDIR
  • MKLINK
  • MOVE
  • PUSHD
  • REN
  • 重命名
  • SETLOCAL
  • 时间
  • TYPE
  • VER
  • 验证
  • VOL

  • 然后,如果从命令行或在带有 .bat扩展名的脚本中发出这些命令,则这些命令在成功后不会清除ERRORLEVEL,但是如果是从带有 .cmd扩展名的脚本中发出,则这些命令不会将ERRORLEVEL清除为0。有关更多信息,请参见 https://stackoverflow.com/a/148991/1012053https://groups.google.com/forum/#!msg/microsoft.public.win2000.cmdprompt.admin/XHeUq8oe2wk/LIEViGNmkK0J
  • ASSOC
  • DPATH
  • FTYPE
  • PATH
  • PROMPT
  • SET

  • 最后,有些命令无法很好地适合任何先前的类别:
  • CALL:如果调用了:routine或批处理脚本,则ERRORLEVEL仅由CALLed脚本或:routine控制。但是,如果CALLed命令没有进行其他设置,则任何其他类型的对命令的成功CALL都会将ERRORLEVEL清除为0。
    示例:call echo OK
  • EXIT:如果不使用/B使用,则cmd.exe session 终止,并且不再有错误级别,仅cmd.exe返回代码。显然,EXIT /B 0将ERRORLEVEL清除为0,但是没有值的EXIT /B保留了先前的ERRORLEVEL。

  • 我相信,这将说明所有内部命令,除非我错过了一个未记录的命令。

    关于batch-file - 哪些cmd.exe内部命令在成功后将ERRORLEVEL清除为0?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34968009/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com