我有一个被称为检查的子例程ERRORLEVEL。
该子例程调用其他子例程来记录消息、发送电子邮件,然后退出脚本。它转到:END,然后在调用后返回到 stmt
@echo off
echo starting...
call:checkTime
echo +++ after CT
GOTO:END
:checkTime
echo the time is %TIME%
goto:END
goto:EOF
:END
Run Code Online (Sandbox Code Playgroud)
这个问题措辞不好,但我想我明白(特别是如果我专注于标题)
我对你的问题的解释:
在批处理文件中的各个点,您检查错误级别。每当检测到错误时,您都希望执行一些标准错误处理,然后退出批处理脚本。您尝试创建一个子例程来执行标准处理,但该子例程返回到调用者而不是退出脚本。您的问题是,如何强制错误处理例程退出而不是返回调用者?
回答:
如果在被调用的子例程中没有发生任何错误检测,那么您可以简单地转到错误处理器而不是调用它。
如果您希望能够调用该例程并从另一个被调用的例程中退出,那么您可以继续使用该语句,但使用而不是orCALL终止您的错误例程。EXITGOTO :EOFGOTO :END
回应评论的附录
是的,GOTO 不能传递参数,并且 CALLed 例程将始终返回到调用者(除非例程以 EXIT 结束)
是的,EXIT 将关闭当前的 CMD shell,这通常会关闭控制台窗口。
但是...您可以通过另一个 CMD shell 让批处理文件自行执行,这样 EXIT 就不会关闭窗口!
我认为唯一潜在的缺点是一旦批处理文件(以及运行它的 CMD shell)终止,对环境的更改就会丢失。这对您来说可能是问题,也可能不是问题。
@echo off
if "%~1" equ "_GO_" goto :main
cmd /c ^""%~f0" _GO_ %*^"
exit /b
:main
shift /1
echo %%1=%1 %%2=%2
echo before call
call :exitRoutine
:: should not get here
echo after call
exit /b
:exitRoutine
echo exiting batch file witin exitRoutine
exit
Run Code Online (Sandbox Code Playgroud)