关闭一个窗户棒并做一些动作

时间:2013-08-09 03:42:36

标签: windows batch-file cmd

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

我正在做的是这样的:我开始一个蝙蝠,并且蝙蝠开始两个进程,当dos蝙蝠关闭时,这两个进程也应该关闭。     用户经常直接关闭dos窗口,不要使用我提供的stop.bat,所以我在考虑是否有可能抓住用户的近距离行动并做点什么!!

谢谢!!!!

4 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

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

: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的脚本。它可能没那么好,但我对这些东西很新,所以这是我能想到的最好的。

希望这能帮到你!

答案 2 :(得分:0)

关于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

答案 3 :(得分:0)

使用第二批处理是其他答案所建议的方法。

但是,使用“ 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