
У меня есть простой пакетный файл, который вызывает другие пакетные файлы, он выглядит так:
start /b run_part1.bat
start /b run_part2.bat
start /b run_part3.bat
start /b run_part4.bat
run_last.bat // fires immediately, how to make this line wait until above finishes?
С ключом /b первые 4 файла будут запущены одновременно. Все будут завершены в течение 1,5 часов.
Мне нужен еще один скрипт, чтобы сделать очистку после завершения всех четырех файлов. Однако run_last.bat не будет ждать первых 4 файлов, он вызывается одновременно с первыми 4.
Есть ли способ этого добиться?
Спасибо.
решение1
Перестаньте использовать устаревшую командную строку и используйте Powershell. Вы можете использоватьМодуль ThreadJob, как описано вэтот превосходный ответ на SO:
$commands = { ./run_part1.bat },
{ ./run_part2.bat },
{ ./run_part3.bat },
{ ./run_part4.bat }
$jobs = $commands | Foreach-Object { Start-ThreadJob $_ }
$jobs | Receive-Job -Wait -AutoRemoveJob
./run_last.bat
решение2
вы можете использовать CALL, он вызывает один файл BAT из другого файла BAT
для получения дополнительной информации проверьтеhttps://www.robvanderwoude.com/call.php
решение3
В пакетных файлах нет встроенных средств для решения этой проблемы.
Вы можете изменить 4 пакетных файла, чтобы создать файл флага, когда они будут готовы. Затем в основном пакетном файле запустите цикл поиска файлов флагов с вызовом timeout /t 10
в цикле, чтобы замедлить проверки.