批处理文件是否支持退出陷阱?

ant*_*ony 6 batch-file

Windows .bat脚本是否具有类似于退出陷阱的功能,这将允许注册始终需要运行的清理操作?

我对使用Powershell或其他shell的任何解决方案都不感兴趣(我已经在目标系统上安装了Python,所以如果在批处理文件中无法完成,我将在try中将一堆调用包装到subprocess.Popen中. ..最后).

dbe*_*ham 7

不,没有例外,并且没有正式的方法来注册退出例程以在终止时自动运行.

但是,如果在脚本终止后不需要更改环境,则可以关闭.您可以在新的CMD会话中运行大部分脚本,然后您可以在父级别中拥有清理例程,只要控制台窗口未被终止,该例程将始终在终止时运行.如果内部脚本正常终止,或者由于Ctrl-C而终止,或者由于致命的语法错误而终止,控件将返回到外壳.

这是一个简单的演示:

@echo off
if "%~1" equ ":main" (
  shift /1
  goto main
)
cmd /d /c "%~f0" :main %*
echo Cleanup actions go here
exit /b

:main
echo Main actions go here
exit /b
Run Code Online (Sandbox Code Playgroud)

更新 - 黑客例外

我已经开发了一个有效的异常hack,只使用本机批处理命令 - 请参阅Windows批处理是否支持异常处理?.

可以在代码的任何级别抛出异常,异常冒泡,直到catch块处理异常.代码本身无法识别错误 - 必须由代码显式抛出每个异常.它也无法响应,致命的语法错误或关闭控制台.但如果这些限制是可以接受的,那么它是一种非常有效的安装清理代码的方法.