Пакетный скрипт Windows с несколькими зависимостями и возможной асинхронностью
Как вы можете запустить серию команд в окнах, где некоторые зависят от завершения других, а некоторые могут запускаться одновременно в асинхронном режиме. Что-то вроде этого:
команда 1
когда команда 1 завершится, запустите команды 2
когда команда 2 завершится, запустите команды 3, 4 одновременно
когда команда 3 завершится, запустите команды 5, 6 и 7 одновременно
когда команда 4 завершится, запустите команды 8, 9 и 10 одновременно
1 ответ
Выложенный вами сценарий очень прост, потому что каждый шаг зависит от выполнения только одного предшественника. Опрос не требуется.
Вы не говорите, что каждая из команд. Сначала я предполагаю, что все они являются пакетными или консольными командами, которые по своей сути выполняются синхронно. Другими словами, пакетный файл не будет переходить к следующей команде, пока предыдущая команда не будет выполнена. В этом случае вы используете команду START только тогда, когда хотите запустить команду асинхронно.
Ваш сценарий может быть легко реализован с использованием 2 пакетных сценариев. stepA.bat инициирует весь процесс.
stepA.bat
@echo off
command1
start "" stepB.bat
command4
start "" command8
start "" command9
command10
stepB.bat
@echo off
command3
start "" command5
start "" command6
command7
Если command1, command4 или command3 является пакетным сценарием, то он должен вызываться с помощью CALL, иначе управление не будет возвращено вызывающей стороне. Например, если command1 был "someScript.bat", то вам нужно будет использовать call someScript.bat
,
Если command1, command4 или command3 не являются консольными командами, а являются командами, которые открывают свое собственное окно (например, notepad.exe), то команда будет выполняться по умолчанию асинхронно, и пакетный файл будет продолжен до ее завершения. Вы должны использовать START /WAIT, чтобы сделать его синхронным. Так что, если command1 были "notepad.exe", то вам нужно будет использовать start "" /wait notepad.exe
,
Если команда 5, команда 6, команда 8 или команда 9 не являются консольными командами (другими словами, они асинхронны по своей природе), вам не нужно использовать START, хотя это не помешает.
У вас может быть сценарий, в котором вы хотите запустить A1,A2 и A3 асинхронно, а затем запустить B только после того, как A1,A2 и A3 завершены. Это потребует некоторой формы опроса, чтобы определить, когда все три закончили. Каждый из процессов A должен был бы каким-то образом сигнализировать о завершении, а B должен был бы повторно опросить и дождаться получения всех 3 сигналов, прежде чем продолжить. Одной из форм сигнала может быть создание файла, но есть много вариантов.