这里我的问题是我想直接关闭一个windows bat dos窗口,当调用关闭动作时,应该调用一些动作或另一个bat,我该如何实现呢?
我正在做的是这样的:我启动一个bat,bat启动两个进程,当dos bat关闭时,这两个进程也应该关闭。用户经常直接关闭dos窗口,不要使用我提供的stop.bat,所以我在想是否有可能捕捉到用户的关闭动作并做点什么!!
谢谢你 !!!!
这里我的问题是我想直接关闭一个windows bat dos窗口,当调用关闭动作时,应该调用一些动作或另一个bat,我该如何实现呢?
我正在做的是这样的:我启动一个bat,bat启动两个进程,当dos bat关闭时,这两个进程也应该关闭。用户经常直接关闭dos窗口,不要使用我提供的stop.bat,所以我在想是否有可能捕捉到用户的关闭动作并做点什么!!
谢谢你 !!!!
好吧,我已经解决了这个问题。主要思路来自[ Windows shutdown hook on java application run from a bat script ],但是答案有一个bug,就是如果我强行关闭Bat或者Cmd,动作可能不会被调用,这里的原因是JVM在调用 java 代码操作之前关闭。所以我把动作放在本机方法中。
我最近做了这样的事情。基本上我设法让它工作的方式是,当我们启动主批处理文件(我们称之为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的脚本。它可能没有它可能的那么好,但我对这些东西很陌生,所以这是我能想到的最好的。
希望这对你有帮助!
只是对 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"
如果任务列表中没有这样的窗口标题,或者像这样:
"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