我需要运行批处理“脚本 A”,这仅在通过“您要退出 [y / n] 问题”以编程方式关闭批处理或批处理中的所有脚本都结束时运行。
如果用户决定通过鼠标按钮(控制台右上角的“X”)关闭批处理,如果批处理崩溃,不幸的是,“脚本 A”将不会被执行。
如何以编程方式拦截“X”的任何时刻并启动另一批以完成契约?
亲切的问候,
马莱克
我需要运行批处理“脚本 A”,这仅在通过“您要退出 [y / n] 问题”以编程方式关闭批处理或批处理中的所有脚本都结束时运行。
如果用户决定通过鼠标按钮(控制台右上角的“X”)关闭批处理,如果批处理崩溃,不幸的是,“脚本 A”将不会被执行。
如何以编程方式拦截“X”的任何时刻并启动另一批以完成契约?
亲切的问候,
马莱克
以下简单的方案似乎有效。清理脚本通过带有 /WAIT 选项的 START 命令调用主脚本。这确保即使子进程通过关闭窗口而被终止,控制也会返回。
父清理脚本通常会提示您是否要“终止批处理作业(Y/N)?” 如果主脚本被关闭窗口杀死。如果出现该提示,我将 N 输入到 START 命令中以自动回答该提示。stderr 到 nul 的外部块重定向抑制了^C
在主窗口被杀死时出现的丑陋(Control-C)。
主批处理文件不是直接启动的,而是通过 CMD /C 命令启动的。这确保即使按 Control-C 杀死主脚本,控制也会返回。这也消除了在主脚本中放置 EXIT 命令的需要(可能永远不会以任何方式执行)。
清理.bat
@echo off
:: Launch the main program and don't continue until it completes (or is killed)
2>nul (
echo N|start /wait "" cmd /c main.bat
)
:: Cleanup up begins here
echo Time to wrap it up!
这是一个简单的main.bat来测试返回功能
@echo off
echo This is the main script.
echo(
echo Press any key to close normally
echo or Close this window via the console window X button
echo or Press Ctrl-C to break out of this script abnormally
pause >nul
编辑
当然,没有什么可以阻止用户在主脚本终止之前关闭“cleanup.bat”窗口,这会让你回到第一方:-(
您可以通过 wscript 运行 VBScript 或 Jscript,而无需关闭任何可见窗口。然后(VB/J)脚本可以启动 main.bat 脚本,然后仅在主进程完成(或被杀死)时启动 cleanup.bat 脚本。这将使最终用户更难以干预启动清理脚本的过程。
大师.vbs
Set WshShell = CreateObject("WScript.Shell")
WshShell.Run "D:\test\main.bat", 1, TRUE
WshShell.Run "D:\test\cleanup.bat", 1, TRUE
Set WshShell = Nothing
但是一旦你越过了这个门槛,为什么不使用 (VB/J) 脚本来完成整个项目呢?
批次无法判断它何时从红色 X 关闭。因此,任何处理从 X 关闭的代码都必须来自其他地方。一种可能性是使用另一批TASKLIST
来监控第一批何时关闭。