Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/batch-file/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Batch file 批处理文件是否支持退出陷阱?_Batch File - Fatal编程技术网

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

Batch file 批处理文件是否支持退出陷阱?,batch-file,Batch File,Windows.bat脚本是否具有类似退出陷阱的功能,允许注册始终需要运行的清理操作 我对任何使用Powershell或其他Shell的解决方案都不感兴趣(我已经在目标系统上安装了Python,因此如果无法在批处理文件中完成,我将在try…finally中包装一系列对subprocess.Popen的调用)。批处理不支持类似的任何操作 但是,cmd也没有异常,并且很少有异常终止脚本的方法(例如,脚本中的语法错误或cmd.exe崩溃)。如果您的脚本没有故意终止自身,则只需在脚本末尾进行任何清理即可

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


我对任何使用Powershell或其他Shell的解决方案都不感兴趣(我已经在目标系统上安装了Python,因此如果无法在批处理文件中完成,我将在try…finally中包装一系列对subprocess.Popen的调用)。

批处理不支持类似的任何操作

但是,cmd也没有异常,并且很少有异常终止脚本的方法(例如,脚本中的语法错误或cmd.exe崩溃)。如果您的脚本没有故意终止自身,则只需在脚本末尾进行任何清理即可


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

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

但是,如果在脚本终止后不需要环境更改来保持,则可以接近。您可以在一个新的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
更新-黑客入侵异常

此后,我只使用本机批处理命令开发了一种有效的异常破解方法-请参见


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

什么引起了这个问题?我想确保在批处理文件的末尾清除一些临时锁定文件。EDIT-使用/D选项可以防止在实例化子shell时自动运行命令。我想这就是设置退出代码的目的,根据主批处理文件的退出代码,允许执行辅助批处理文件。@user4317867-退出代码(errorlevel)仅通知调用者返回的状态是什么-不允许父级执行。如果被调用的脚本或标签由于Ctrl-C或致命语法错误而异常终止,则所有批处理立即终止,并且控制权永远不会返回给调用方。我的答案使用CMD/C来解决这个问题。在执行子shell期间,当我按ctrl+C时,我两次遇到了“终止批处理作业?(Y/N)”问题。这是恼人的,因为这个问题应该只出现一次的子外壳,但不为家长后立即。。。您有什么解决方案吗?唉,我想在用户关闭命令窗口时做些什么:|