关闭windows蝙蝠并执行一些操作

关闭windows蝙蝠并执行一些操作,windows,batch-file,cmd,Windows,Batch File,Cmd,这里我的问题是我想直接关闭一个windows bat dos窗口,当调用关闭操作时,应该调用一些操作或另一个bat,我如何实现这一点 我所做的是这样的:我启动一个bat,bat启动两个进程,当dos bat关闭时,这两个进程也应该关闭。 用户经常直接关闭dos窗口,不要使用我提供的stop.bat,所以我在考虑是否有可能捕捉到用户的关闭操作并做些什么 谢谢 我已经解决了这个问题。主要思想来自[],但答案有一个bug,即如果我强制关闭Bat或Cmd,操作可能不会被调用,原因是JVM在调用java代

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

我所做的是这样的:我启动一个bat,bat启动两个进程,当dos bat关闭时,这两个进程也应该关闭。 用户经常直接关闭dos窗口,不要使用我提供的stop.bat,所以我在考虑是否有可能捕捉到用户的关闭操作并做些什么


谢谢

我已经解决了这个问题。主要思想来自[],但答案有一个bug,即如果我强制关闭Bat或Cmd,操作可能不会被调用,原因是JVM在调用java代码操作之前关闭。所以我把动作放在本机方法中。

好吧,我已经解决了这个问题。主要思想来自[],但答案有一个bug,即如果我强制关闭Bat或Cmd,操作可能不会被调用,原因是JVM在调用java代码操作之前关闭。所以我把动作放在原生方法中。

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

这就是我在bat2中使用的脚本。它可能没有它可能是好的,但我是非常新的东西,所以它是最好的,我可以想出


希望这对你有帮助

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

这就是我在bat2中使用的脚本。它可能没有它可能是好的,但我是非常新的东西,所以它是最好的,我可以想出


希望这对你有帮助

请注意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

只是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

正如其他答案所建议的那样,使用第二批是可行的

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

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

“信息:blablabla…”

我们将其放入只运行一次且只拾取第一个令牌的FOR/F循环中:

“cmd.exe”或“信息:blabla…”

现在,“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

正如其他答案所建议的那样,使用第二批是可行的

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

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

“信息:blablabla…”

我们将其放入只运行一次且只拾取第一个令牌的FOR/F循环中:

“cmd.exe”或“信息:blabla…”

现在,“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

也许这个解决方案是可行的:{}但是它使用java native,这让它变得复杂,有没有简单的解决方案?我认为使用纯批处理脚本是不可能做到这一点的,但是借助另一种语言可能是可行的……也许这个解决方案是可行的:{}但是它使用java native,这让它变得复杂,有什么简单的解决方案吗?我认为使用纯批处理脚本是不可能做到这一点的,但是借助另一种语言可能是可能的。。。