Выполнение вложенной пакетной структуры прекращается

У меня есть вложенная пакетная структура. Сначала я начинаю с X.cmd, который вызывает X1.cmd, а затем X2.cmd. Но требуется, чтобы X2.cmd запускался точно после того, как X1.cmd выполнит свою работу.

В настоящее время после выполнения X1.cmd он не продолжается с X2.cmd. Я думаю, это из-за оператора «старт». (похоже, он уничтожает родительское окно.) Чтобы решить эту проблему. Я изменил структуру и сделал вызов X2.cmd внутри X1.cmd. Однако на этот раз проблема в следующем: X2.cmd запускается до того, как tst10.exe завершает свою работу, и для меня это бесполезно. (Хотя это довольно логично. Потому что X1.cmd завершает выполнение первых 4 строк, вызывая tst10.exe, и продолжает, вызывая X2.cmd. Но для меня это бесполезно, так как мне нужно, чтобы tst10.exe завершил свою работу)

Мне нужно иметь возможность определить, что tst10.exe завершил свою работу, его окна закрываются, а затем я должен вызвать X2.cmd. Как я могу это сделать?

Вот структура, которую я хочу использовать: (X2.cmd должен выполнить свою работу после того, как tst10.exe завершит свою работу)

X.cmd

X1.cmd
X2.cmd

X1.cmd

start tst10.exe /r:a.txt /o:a.txt
start tst10.exe /r:b.txt /o:b.txt
start tst10.exe /r:c.txt /o:c.txt
start tst10.exe /r:d.txt /o:d.txt

X2.cmd

start K.cmd
start L.cmd
start M.cmd
start N.cmd

person Xentius    schedule 29.01.2014    source источник


Ответы (2)


x.cmd

call x1.cmd
call x2.cmd

x1.cmd

start tst10.exe /r:a.txt /o:a.txt
start tst10.exe /r:b.txt /o:b.txt
start tst10.exe /r:c.txt /o:c.txt
start tst10.exe /r:d.txt /o:d.txt

:testloop
    tasklist | find "tst10.exe" >nul || exit /b 0
    ping -n 2 localhost > nul
    goto testloop

x2.cmd

call K.cmd
call L.cmd
call M.cmd
call N.cmd

Без call выполнение передается вызываемому пакетному файлу и не возвращается вызывающему.

person MC ND    schedule 29.01.2014
comment
@Xentius, извините, я делаю 3 вещи одновременно и публикую неполный ответ. - person MC ND; 29.01.2014
comment
@Xentius, x2 будет выполнен, когда завершится x1, и выполнение вернется к вызывающей стороне (x.cmd) для продолжения. - person MC ND; 29.01.2014
comment
@Xentius, я изменю ответ, но вы не указали, что процессы tst10 должны быть параллельными. - person MC ND; 29.01.2014
comment
@Xentius, обновлено. ping используется для включения задержки. Вы также можете использовать timeout /t 1, если он доступен в вашей ОС. - person MC ND; 29.01.2014
comment
Большое спасибо за ваш ответ. И последнее, что, возможно, вам следует отредактировать: мне нужно было использовать start, а не вызывать X2.cmd (start K.cmd start L.cmd и т. д.). Моя ОС поддерживает тайм-аут /t 1, но какой из них более эффективен, по вашему мнению? таймаут или пинг? - person Xentius; 29.01.2014
comment
также я не мог понять причину, по которой мы использовали пинг или тайм-аут. Не могли бы вы объяснить это? Еще раз большое спасибо за вашу помощь. - person Xentius; 29.01.2014
comment
@Xentius, если пакетные файлы, вызываемые из x2.cmd, являются параллельными, то, конечно, не используйте call. Для ожидания завершения test10 определен цикл. Пока программа находится в списке задач, продолжайте зацикливаться. «Пинг» или «тайм-аут» просто добавляют задержку между каждой проверкой. Таймаут не входит в XP, поэтому пинг — обычная замена. - person MC ND; 29.01.2014

используйте start с параметром ожидания в x.cmd только для запуска X1.cmd. вот так: X.cmd start /wait X1.cmd

person golazo    schedule 29.01.2014