1

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

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

谢谢你 !!!!

4

4 回答 4

1

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

于 2013-08-13T02:47:01.787 回答
0

我最近做了这样的事情。基本上我设法让它工作的方式是,当我们启动主批处理文件(我们称之为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的脚本。它可能没有它可能的那么好,但我对这些东西很陌生,所以这是我能想到的最好的。

希望这对你有帮助!

于 2013-08-13T10:57:11.150 回答
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
于 2016-10-24T06:03:37.847 回答
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
于 2020-05-14T21:43:16.070 回答