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

时间:2015-03-05 22:36:51

标签: batch-file

Windows .bat脚本是否具有退出陷阱功能,可以注册始终需要运行的清除操作?

我对使用Powershell或其他shell的任何解决方案都不感兴趣(我已经在目标系统上安装了Python,所以如果不能在批处理文件中完成,我只需要打包一堆调用to subprocess.Popen in try ... finally)。

2 个答案:

答案 0 :(得分:6)

不,没有例外,也没有正式的注册退出例程在终止时自动运行的方法。

但是,如果在脚本终止后不需要更改环境,则可以关闭。您可以在新的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

更新 - 黑客例外

我已经开发了一个有效的异常黑客,只使用本机批处理命令 - 请参阅 Does Windows batch support exception handling?

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

答案 1 :(得分:1)

Batch不支持这样的任何内容。

但是,cmd也没有例外,并且很少有异常终止脚本的方法(例如脚本中的语法错误,或者崩溃cmd.exe)。如果您的脚本没有故意自行终止,那么在脚本的末尾简单地进行任何清理应该是安全的。

更进一步,您可以在另一个批处理文件的子shell中调用批处理文件,并让外部脚本进行清理。然后,无论脚本中发生什么,外壳都会在外部批处理完成后运行下一个命令。

相关问题