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