如何使批处理等待多个子进程

how to make batch wait for multiple subprocesses

我有这个批处理文件:

SET WINRAR="C:\Program Files (x86)\WinRAR"
start "" %WINRAR%\WinRAR.exe a -u -m5 "Group 1.rar" "Group 1" "Group 1"
start "" %WINRAR%\WinRAR.exe a -u -m5 "Group 2.rar" "Group 2" "Group 2"
start "" %WINRAR%\WinRAR.exe a -u -m5 "Group 3.rar" "Group 3" "Group 3"
start "" "D:\"

我希望所有 rar 进程同时工作,并在 rar 完成后打开目录 D:\

您可以通过在没有 /WAIT 的情况下启动您的 un-rar 进程并使用 tasklist:

检查它们是否完成来实现这一点
@ECHO OFF
SET WINRAR="C:\Program Files (x86)\WinRAR"
start "" %WINRAR%\WinRAR.exe a -u -m5 "Group 1.rar" "Group 1" "Group 1"
start "" %WINRAR%\WinRAR.exe a -u -m5 "Group 2.rar" "Group 2" "Group 2"
start "" %WINRAR%\WinRAR.exe a -u -m5 "Group 3.rar" "Group 3" "Group 3"

:LOOP
tasklist /FI "IMAGENAME eq WinRAR.exe" 2>NUL | find /I /N "WinRAR.exe">NUL
if %ERRORLEVEL%==0 (
    ping localhost -n 6 >nul
    GOTO LOOP
)
start "" "D:\"

代码执行以下操作:

首先,您启动所有解压缩过程。然后检查您的任务列表是否包含任何 winrar.exe 个进程。如果是这种情况,请等待 5 秒并再次检查。一旦任务列表中不再有 winrar.exe 个条目,您将继续 start "" "D:\"

编辑:正如您询问的 wait by ping 是如何工作的,这里是解释。 抱歉,我的代码中有错误。是 ping localhost -n 6 而不是 ping localhost -6

ping localhost -n 6>nul 使您的系统 ping localhost 6 次,每次 ping 之间间隔 1 秒。 6 次 1 秒之间的 ping 是 5 :) 由于本地主机在 1 毫秒内响应,您正在等待大约 5 秒。 >nul 取代控制台中 ping 命令的输出。

恐怕仅通过批处理文件无法提供解决方案。您通过跳出框框思考并实施完成工作的程序而获得的选项。

例如,一个好的实现可能是使用 app.activate 方法,它允许您检查是否存在具有特定名称 "alive" 的 window。

如果您选择遵循此路径,解决方案是创建一个名为 "waitForAll.vbs" 的 vbs 文件(例如)并提供如下内容:

Dim objShell
dim found
dim nCount

Set objShell = CreateObject("WScript.Shell")

found = true 
nCount = 100  ' to avoid hangings
do while found and nCount > 0 
   found = objShell.appActivate("CAPTION OF YOUR WINRAR WINDOWS")
   wscript.sleep 5 * 1000 ' sleep for five seconds 
   nCount = nCount - 1
loop ' found 

if not found then 
  ' launch whatever
end if ' not found 

而不是那个 start "" d:\ 你必须插入对这个 "waitForAll.vbs" 程序的调用:该程序将在用户空间中查找所有被称为类似的 windows winrar的那些:当找不到它们时,它会启动任何你想要的。

可选地,如果 winrar window 挂起(带有弹出消息或类似信息),该程序最终会通过 nCount 计数器结束。