正如其他答案所建议的那样,使用第二批是要走的路。
但是使用“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