【问题标题】:close a windows bat and do some actions关闭 Windows bat 并执行一些操作
【发布时间】:2013-08-09 03:42:35
【问题描述】:

这里我的问题是我想直接关闭一个windows bat dos窗口,当调用close动作时,应该调用一些动作或者另一个bat,我该如何实现呢?

我做的是这样的:我启动一个bat,bat启动两个进程,当dos bat关闭时,两个进程也应该关闭。 用户经常直接关闭dos窗口,不要使用我提供的stop.bat,所以我在想有没有可能抓到用户的关闭动作做点什么!!

谢谢你!!!!

【问题讨论】:

  • 也许这个解决方案可行:{stackoverflow.com/questions/9277630/…} 但是它使用的是java native,这很复杂,有什么简单的解决方案吗?
  • 我认为使用纯批处理脚本是不可能做到这一点的,但是它可能在另一种语言的帮助下是可能的......

标签: windows batch-file cmd


【解决方案1】:

好吧,我已经解决了这个问题。主要思路来自[Windows shutdown hook on java application run from a bat script],但是答案有个bug,就是如果我强行关闭Bat或者Cmd,可能无法调用动作,这里的原因是JVM关闭在调用 java 代码操作之前。所以我把动作放在原生方法中。

【讨论】:

    【解决方案2】:

    我最近做了这样的事情。基本上,我设法让它工作的方式是,当我们启动主批处理文件(我们称之为 bat1)时,我启动了另一个批处理文件(我们称之为 bat2)。

    :start
    tasklist /v | Find "BAT1'S WINDOW NAME GOES HERE"
    if "%ERRORLEVEL%"=="1" COMMAND TO EXECUTE WHEN THE WINDOW IS CLOSED
    if "%ERRORLEVEL%"=="1" exit
    timeout /t 1 /NOBREAK >nul
    goto :start
    

    这是我用于 bat2 的脚本。它可能不如它应该的那么好,但我对这些东西很陌生,所以这是我能想到的最好的。

    希望对你有帮助!

    【讨论】:

      【解决方案3】:

      只是对 AstralBacon 上一个条目的注释。您可以像这样简化它:

      :start
      tasklist /v | Find "BAT1'S WINDOW NAME GOES HERE"
      if "%ERRORLEVEL%"=="1" (
        COMMAND TO EXECUTE WHEN THE WINDOW IS CLOSED
        exit
      )
      timeout /t 1 /NOBREAK >nul
      goto :start
      

      【讨论】:

        【解决方案4】:

        正如其他答案所建议的那样,使用第二批是要走的路。

        但是使用“tasklist /v”搜索整个冗长的任务列表是一个非常缓慢且无效的过程。在我的机器上需要几秒钟。 您可以操作 tasklist 命令输出以仅显示您的批处理(这样更有效)并直接使用该输出,无需管道:

        :START
        for /f "tokens=1 delims=," %%G in ('tasklist /FI "WINDOWTITLE EQ TITLE_OF_ORIGINAL_BATCH" /FO CSV /NH') do (
           if not %%G=="cmd.exe" (
              REM EXECUTE COMMANDS WHEN THE WINDOW IS CLOSED
              exit
           )
        )
        ping 127.0.0.1>nul
        goto START
        

        说明: 首先,我们获取一行 csv 样式的任务列表输出,如果它找到您的批次,则看起来像这样:

        "cmd.exe","8172","Console","1","4.228 K"

        如果任务列表中没有这样的窗口标题,或者像这样:

        "INFORMATION: blablabla..."

        我们将它放入只运行一次并且只选择第一个标记的 FOR /F 循环中:

        “cmd.exe”或“信息:blablabla...”。

        现在 "cmd.exe"/"INFO..." 位于变量 %G 中,可以在 IF 语句中使用该变量来获得其他任务是活还是死的明确答案。

        奖励事实:您可以使用单个 .bat 文件同时启动两个脚本,如下所示:

        @echo off
        if "%1" == "" start "" "%~f0" FLAG && goto actual_script
        
        title EXIT_CHECK
        :START
        for /f "tokens=1 delims=," %%G in ('tasklist /FI "WINDOWTITLE EQ ORIGINAL_BATCH" /FO CSV /NH') do (
           if not %%G=="cmd.exe" (
              REM COMMANDS TO EXECUTE HERE WHEN THE MAIN WINDOW IS CLOSED
              exit
           )
        )
        ping -n 2 127.0.0.1>nul
        goto START
        
        :actual_script
        title ORIGINAL_BATCH
        :loop
        REM SCRIPT GOES HERE
        ping -n 2 127.0.0.1>nul
        goto loop
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2015-01-04
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多