Windows Batch:无法退出被调用的子例程 - 即使 goto:END 也始终返回

chr*_*012 4 batch-file

我有一个被称为检查的子例程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)

dbe*_*ham 5

这个问题措辞不好,但我想我明白(特别是如果我专注于标题)

我对你的问题的解释:

在批处理文件中的各个点,您检查错误级别。每当检测到错误时,您都希望执行一些标准错误处理,然后退出批处理脚本。您尝试创建一个子例程来执行标准处理,但该子例程返回到调用者而不是退出脚本。您的问题是,如何强制错误处理例程退出而不是返回调用者?

回答:

如果在被调用的子例程中没有发生任何错误检测,那么您可以简单地转到错误处理器而不是调用它。

如果您希望能够调用该例程并从另一个被调用的例程中退出,那么您可以继续使用该语句,但使用而不是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)

  • @dbenham:+1 有趣的解决方案,戴夫!“EXIT”也可以用这种方式打破任何级别的任何挂起的 IF/FOR 结构,并且该过程将在调用代码处继续。我可以建议宏“set break=exit”吗?(我们已经在 WHILE 宏中使用了这个想法) (2认同)