为什么不能通过命令启动获取批处理文件的退出代码?

时间:2017-07-05 13:59:58

标签: batch-file

当我在命令提示符窗口中运行命令Start C:\temp\sub2.bat时,错误级别设置为4,这是正确的,因为批处理中指示的文件不存在。但是当我在下面执行此操作时,errorlevel返回0。我不知道为什么退出代码不同。

有人可以给我一个建议吗?

@echo off
Call :Sub1
GOTO :EOF

:Sub1
start C:\temp\sub2.bat
echo %errorLevel%

1 个答案:

答案 0 :(得分:1)

阅读How to call a batch file that is one level up from the current directory?上的答案它解释了从批处理文件中运行批处理文件的4种方法,以及它们之间的区别。

使用命令start导致启动一个新的命令进程,该进程与已执行批处理文件的命令进程并行运行,以执行C:\temp\sub2.bat

当前命令进程会立即继续执行已发布的批处理文件,并评估命令start的退出代码,该代码在成功启动可执行文件或批处理文件时为0。

您应该使用命令call将批处理文件作为批处理文件中的子例程运行,这样就可以评估C:\temp\sub2.bat设置的退出代码。

@echo off
call C:\temp\sub2.bat
if errorlevel 1 echo There was an error with exit code %ERRORLEVEL%.

也可以在新的命令进程中启动另一个批处理文件,并在当前批处理文件中以exit 4终止它的终止文件。

@echo off
start /wait C:\temp\sub2.bat
if errorlevel 1 echo There was an error with exit code %ERRORLEVEL%.

一般情况下,不建议在没有选项exit的情况下使用/B,因为这会导致独立于调用层次结构退出命令进程,从而无法通过运行批处理文件来调试批处理文件在命令提示符窗口中。

如果C:\temp\sub2.bat确实包含exit ExitCode而没有选项/B,并且由于某些未知原因批处理文件无法编辑,则必须启动{{1在单独的命令进程中,等待C:\temp\sub2.bat终止。

要了解使用的命令及其工作原理,请打开命令提示符窗口,执行以下命令,并完全阅读为每个命令显示的所有帮助页面。

  • start /wait
  • call /?
  • echo /?
  • exit /?
  • if /?

另请阅读Microsoft支持文章Testing for a Specific Error Level in Batch Files

另请参阅Stack Overflow问题: