2

我需要运行批处理“脚本 A”,这仅在通过“您要退出 [y / n] 问题”以编程方式关闭批处理或批处理中的所有脚本都结束时运行。

如果用户决定通过鼠标按钮(控制台右上角的“X”)关闭批处理,如果批处理崩溃,不幸的是,“脚本 A”将不会被执行。

如何以编程方式拦截“X”的任何时刻并启动另一批以完成契约?

亲切的问候,

马莱克

4

2 回答 2

3

以下简单的方案似乎有效。清理脚本通过带有 /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) 脚本来完成整个项目呢?

于 2012-07-25T21:30:42.667 回答
0

批次无法判断它何时从红色 X 关闭。因此,任何处理从 X 关闭的代码都必须来自其他地方。一种可能性是使用另一批TASKLIST来监控第一批何时关闭。

于 2012-07-25T20:14:47.830 回答