批处理文件中的“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”不能覆盖先前命令的返回码的主要内容,如果未能解决你的问题,请参考以下文章