【问题标题】:Detect or intercept moment when a batch is closed via mouse (X console button)检测或拦截通过鼠标关闭批次的时刻(X 控制台按钮)
【发布时间】:2012-07-25 19:57:08
【问题描述】:

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

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

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

亲切的问候,

马莱克

【问题讨论】:

    标签: batch-file


    【解决方案1】:

    下面的简单方案似乎可行。清理脚本通过带有 /WAIT 选项的 START 命令调用主脚本。这确保了即使子进程因关闭窗口而被杀死,控制权也会返回。

    父清理脚本通常会提示您是否要“终止批处理作业(Y/N)?” 如果主脚本被关闭窗口杀死。如果出现该提示,我将 N 输入到 START 命令中以自动回答该提示。 stderr 到 nul 的外部块重定向抑制了在主窗口被杀死时出现的丑陋的 ^C (Control-C)。

    主批处理文件不是直接启动的,而是通过 CMD /C 命令启动的。这确保即使按 Control-C 杀死主脚本,控制也会返回。这也消除了在主脚本中放置 EXIT 命令的需要(可能永远不会以任何方式执行)。

    cleanup.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!
    

    这是一个简单的 ma​​in.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 脚本。这将使最终用户更难干预启动清理脚本的过程。

    ma​​ster.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) 脚本来完成整个项目呢?

    【讨论】:

    • 我已经测试了上面的脚本并且它可以工作......但前提是我们在master.vbs中删除WshShell.Run "D:\test\main.bat", 1, TRUE行并将WshShell.Run "D:\test\cleanup.bat", 0, TRUE行从1更改为0。现在,master 将调用 cleanup.bat。该 bat 将隐形运行并立即调用 main.bat。如您所说,当 main 完成或杀死时, cleanup.bat (不可见)将执行最后一个预定义的工作并退出。您的脚本帮助我删除了我前一段时间在另一批中实施的锁,该锁涉及 Intranet 用户访问一个文件。非常感谢!
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-12-11
      • 1970-01-01
      • 2012-08-20
      • 1970-01-01
      • 2013-10-14
      • 2014-05-31
      • 1970-01-01
      相关资源
      最近更新 更多