2015-05-21 2 views
0

У меня есть этот пакетный файл:как сделать пакетное ожидание для нескольких подпроцессов

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 работать одновременно и открыть каталог D:\ после Rar отделки.

ответ

2

Вы можете достичь этого, начав свои не-RAR процессы без/WAIT и проверить ли они закончили с помощью 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:\" 

Этот код выполняет следующие действия:

Прежде чем начать все ваши un-rar. Затем вы проверяете, содержит ли ваш список задач какие-либо процессы winrar.exe. Если это так, вы ждете 5 секунд и снова проверьте. Как только в списке задач больше нет записей winrar.exe, вы переходите к start "" "D:\".

РЕДАКТИРОВАТЬ: Как вы спросили, как работает работа ping, вот объяснение. Извините, в моем коде была ошибка. Это ping localhost -n 6, а не ping localhost -6.

ping localhost -n 6>nul делает вашу систему ping localhost 6 раз с 1 секундой между каждым пингом. 6 пингов с 1 секундой между 5: Как localhost отвечает в течение 1 мс, вы ожидаете около 5 секунд. >nul обеспечивает вывод команды ping в консоли.

+0

Это прекрасно работает, спасибо большое ... но что такое -6? вы можете объяснить, пожалуйста ... и это означает, что я должен написать код, подобный этому ping localhost -6 (5)> nul ИЛИ ping localhost -6> nul .. THANK YOU – Hauari

+0

Я отредактирую свой ответ и объясню смысл этого. – MichaelS

+0

Готово. Последнее замечание: если вы хотите подождать X секунд, вам нужно будет выполнить ping localhost -n X + 1'. – MichaelS

1

Боюсь, что решение не доступно только из пакетного файла. Варианты, которые вы проходите, задумываясь вне коробки и реализуя программу, выполняющую эту работу.

Например, хорошая реализация может использовать метод app.activate, который позволит вам проверить, есть ли окно с определенным именем «живое».

Если вы выберете по этому пути, то решение было бы создать файл VBS под названием «waitForAll.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.

+0

Боюсь, вы ошибаетесь. Пакет более мощный, чем вы ожидаете ;-) Проверьте мой ответ. – MichaelS

+0

Да, я прочитал его сразу после окончания написания. Очень хорошее решение: D –

Смежные вопросы