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

时间:2015-05-21 08:32:25

标签: batch-file cmd wait

我有这个批处理文件:

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:\

2 个答案:

答案 0 :(得分:3)

您可以通过在没有/ WAIT的情况下启动非rar流程并检查他们是否已使用@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:\" 完成来实现此目的:

start "" "D:\"

代码执行以下操作:

首先,您启动所有非rar进程。然后检查您的任务列表是否包含任何winrar.exe进程。如果是这种情况,请等待5秒钟再次检查。只要任务列表中没有更多winrar.exe条目,您就可以转到ping localhost -n 6

编辑:正如您已经问过ping的等待方式,这里有解释。 对不起,我的代码中有一个错误。它是ping localhost -6而不是ping localhost -n 6>nul

>nul使您的系统ping每次ping主机6次,每次ping 1秒。 6个ping,1秒之间是5 :)当localhost在1 ms内响应时,你等待大约5秒钟。 {{1}}在控制台中支持ping命令的输出。

答案 1 :(得分:1)

我担心只有批处理文件才能解决这个问题。您通过在框外思考并实施完成工作的程序来传递的选项。

例如,一个好的实现可能是使用app.activate方法,它允许您检查是否存在某个名称为“alive”的窗口。

如果您选择遵循此路径,解决方案是创建名为“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 

而不是那个开始“”d:\你必须插入对这个“waitForAll.vbs”程序的调用:程序将查找用户空间中被称为类似于winrar的所有窗口:当他们找不到时,它会开始你想要的任何东西。

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