Batch file 如何使批处理等待多个子流程

Batch file 如何使批处理等待多个子流程,batch-file,cmd,wait,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"

我有这个批处理文件:

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进程来实现这一点,并使用
任务列表检查它们是否完成:

@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:\"
该代码执行以下操作:

首先,启动所有un rar流程。然后检查任务列表是否包含任何winrar.exe进程。如果是这种情况,请等待5秒钟,然后再次检查。一旦任务列表中不再有winrar.exe条目,您就转到
start”““D:\”

编辑:正如您所问的,通过ping等待是如何工作的,下面是解释。 对不起,我的代码中有一个bug。它是
ping localhost-n6
而不是
ping localhost-6


ping localhost-n 6>nul
使您的系统ping localhost 6次,每次ping之间间隔1秒。6次ping,间隔1秒为5:),当localhost在1ms内响应时,您将等待大约5秒
>nul
在控制台中支持ping命令的输出。

您可以通过不使用/WAIT启动un 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:\"
该代码执行以下操作:

首先,启动所有un rar流程。然后检查任务列表是否包含任何winrar.exe进程。如果是这种情况,请等待5秒钟,然后再次检查。一旦任务列表中不再有winrar.exe条目,您就转到
start”““D:\”

编辑:正如您所问的,通过ping等待是如何工作的,下面是解释。 对不起,我的代码中有一个bug。它是
ping localhost-n6
而不是
ping localhost-6


ping localhost-n 6>nul
使您的系统ping localhost 6次,每次ping之间间隔1秒。6次ping,间隔1秒为5:),当localhost在1ms内响应时,您将等待大约5秒
>nul
在控制台中支持ping命令的输出。

恐怕仅通过批处理文件无法负担此解决方案。你所拥有的选择是通过跳出框框去思考,并实施一个完成这项工作的程序

例如,一个好的实现可以使用允许您检查是否存在具有特定名称“活动”的窗口的方法

如果选择遵循此路径,解决方案将是创建一个名为“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 
您必须插入对“waitForAll.vbs”程序的调用:该程序将查找用户空间中所有被称为类似于winrar的窗口的窗口:当找不到这些窗口时,它将启动您想要的任何窗口


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

恐怕仅从批处理文件无法负担解决方案。你所拥有的选择是通过跳出框框去思考,并实施一个完成这项工作的程序

例如,一个好的实现可以使用允许您检查是否存在具有特定名称“活动”的窗口的方法

如果选择遵循此路径,解决方案将是创建一个名为“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 
您必须插入对“waitForAll.vbs”程序的调用:该程序将查找用户空间中所有被称为类似于winrar的窗口的窗口:当找不到这些窗口时,它将启动您想要的任何窗口


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

这很好,非常感谢你。。。但是-6是什么意思呢?你能解释一下吗。。。这意味着我必须像pinglocalhost-6(5)>nul或pinglocalhost-6>nul这样编写代码。。谢谢。我将编辑我的答案,并解释这一点的含义。完成。最后一句话:如果要等待X秒,必须执行pinglocalhost-nx+1
。是否有任何方法在子进程结束后获取其错误级别?unix在这方面做得更好-(这很好,非常感谢…但是-6是什么意思?请解释一下…这意味着我必须像ping localhost-6(5)那样编写代码)>nul或ping localhost-6>nul..谢谢。我将编辑我的答案并解释其含义。完成。最后一句话:如果您想等待X秒,您必须执行ping localhost-n X+1。是否有任何方法可以在子进程结束后获取其错误级别?unix在这方面做得更好-(我恐怕你错了。Batch比你预期的更强大;-)看看我的答案。是的,我刚写完我的答案就看了。非常好的解决方案:我恐怕你错了。Batch比你预期的更强大;-)看看我的答案。是的,我刚写完我的答案就看了。非常好的解决方案:D