Ожидание завершения процесса, созданного путем вызова командного файла

110
14

MyFile1.bat дважды вызывает MyFile2.bat:


start MyFile2.bat argA, argB, argC
start MyFile2.bat argX, argY, argZ

На этом этапе, как я могу дождаться завершения обоих процессов, порожденных вызовами MyFile2.bat?

спросил(а) 2013-12-02T18:41:00+04:00 6 лет, 4 месяца назад
1
Решение
74

Вы можете использовать "файлы статуса", чтобы знать это; например, в MyFile1.bat выполните следующие действия:


echo X > activeProcess.argA
start MyFile2.bat argA, argB, argC
echo X > activeProcess.argX
start MyFile2.bat argX, argY, argZ
:waitForSpawned
if exist activeProcess.* goto waitForSpawned

И вставьте эту строку в конец MyFile2.bat:

del activeProcess.%1

Вы также можете вставить задержку ping в цикле ожидания, чтобы тратить меньше процессор в этом цикле.

ответил(а) 2013-12-02T20:26:00+04:00 6 лет, 4 месяца назад
101

Просто используйте параметр Start/WAIT.

start /wait MyFile2.bat argA, argB, argC
start /wait MyFile2.bat argX, argY, argZ

ответил(а) 2013-12-14T01:55:00+04:00 6 лет, 3 месяца назад
72

start /w cmd /c "start cmd /c MyFile2.bat argA, argB, argC & start cmd /c MyFile2.bat argA, argB, argCt"

В соответствии с моими испытаниями это должно работать при условии, что MyFile2.bat. В общем случае должны использоваться полные пути к файлам bat.

ответил(а) 2013-12-02T19:43:00+04:00 6 лет, 4 месяца назад
62

Вы можете сделать это следующим образом:


start MyFile2.bat argA, argB, argC
start MyFile2.bat argX, argY, argZ ^& echo.^>End.val ^& exit

:testEnd
if exist end.val (del end.val
echo Process completed
pause)
>nul PING localhost -n 2 -w 1000
goto:testEnd


Когда второй запуск start2.bat - это задание, тогда будет создан файл "End.val", вам просто нужно проверить, существует ли этот файл, тогда вы знаете, что ваш процесс завершен.


Если первый myfile2 может занять больше времени, а затем второй, вы можете сделать то же самое (с другим именем файла) с первым start myfile2.bat и сделать тест больше в :testend


 start MyFile2.bat argA, argB, argC ^& echo.^>End1.val ^& exit
start MyFile2.bat argX, argY, argZ ^& echo.^>End.val ^& exit

:testEnd
if exist end.val if exist end1.val (del end.val
del end1.val
echo Process completed
pause)
>nul PING localhost -n 2 -w 1000
goto:testEnd

ответил(а) 2013-12-04T03:33:00+04:00 6 лет, 4 месяца назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема