批处理文件中的“EXIT”不能覆盖先前命令的返回码

Posted

技术标签:

【中文标题】批处理文件中的“EXIT”不能覆盖先前命令的返回码【英文标题】:"EXIT" in batch file cannot overwrite return code of previous commands 【发布时间】:2014-07-16 12:43:16 【问题描述】:

从 Windows 命令行运行此批处理文件会导致 %errorlevel% 为 5(即在执行批处理文件后在命令行上运行 echo %errorlevel% 会打印数字 5):

EXIT /B 5

这很好。

但是,无论如何,运行此批处理文件都会导致 %errorlevel% 为 0:

sleep 1
EXIT /B 5

我希望它返回错误代码 5。我该怎么做?

注意:如果我将 sys.exit(13) 添加到 sleep.py(见下文),那么第二个批处理文件将返回退出代码 13。所以我的批处理文件将返回退出代码sleep.py 脚本,而不是通过 EXIT 命令指定的退出代码(这很奇怪)。


sleep.bat:

sleep.py %1

sleep.py:

import sys
import time

if len(sys.argv) == 2:
    time.sleep(int(sys.argv[1]))

【问题讨论】:

不,我从命令行回应。所以在命令行上我首先输入“my_batch_script.bat”并让它运行。然后我输入“echo %errorlevel%”。我刚刚尝试了延迟扩展,但它似乎根本无法在命令行上运行(回显!errorlevel!只是打印!errorlevel!)。 【参考方案1】:

sleep 是一个批处理文件。当以这种方式从另一个批处理文件调用批处理文件时,控制永远不会返回给调用者(类似于 POSIX 中的exec)。请改用call sleep 1

或者只是使用内置程序睡觉:

:sleep1
setlocal
set /a X=%~1 + 1
ping ::1 -n %X% >nul 2>&1
endlocal
goto :eof

:sleep2
timeout /T %1 /nobreak
goto :eof

【讨论】:

以上是关于批处理文件中的“EXIT”不能覆盖先前命令的返回码的主要内容,如果未能解决你的问题,请参考以下文章

如何将返回码传递给 at_exit 函数

linux命令后添加 exit 0啥意思

Shell中退出状态码exit

如何识别Java字节码中的覆盖方法?

如何绕过 python 中 sys.exit() 的 0-255 范围限制?

exit