![cmd - запустить пакетный файл после завершения всех других параллельных пакетных файлов](https://rvso.com/image/770100/cmd%20-%20%D0%B7%D0%B0%D0%BF%D1%83%D1%81%D1%82%D0%B8%D1%82%D1%8C%20%D0%BF%D0%B0%D0%BA%D0%B5%D1%82%D0%BD%D1%8B%D0%B9%20%D1%84%D0%B0%D0%B9%D0%BB%20%D0%BF%D0%BE%D1%81%D0%BB%D0%B5%20%D0%B7%D0%B0%D0%B2%D0%B5%D1%80%D1%88%D0%B5%D0%BD%D0%B8%D1%8F%20%D0%B2%D1%81%D0%B5%D1%85%20%D0%B4%D1%80%D1%83%D0%B3%D0%B8%D1%85%20%D0%BF%D0%B0%D1%80%D0%B0%D0%BB%D0%BB%D0%B5%D0%BB%D1%8C%D0%BD%D1%8B%D1%85%20%D0%BF%D0%B0%D0%BA%D0%B5%D1%82%D0%BD%D1%8B%D1%85%20%D1%84%D0%B0%D0%B9%D0%BB%D0%BE%D0%B2.png)
У меня есть простой пакетный файл, который вызывает другие пакетные файлы, он выглядит так:
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
в цикле, чтобы замедлить проверки.