Пакетный скрипт 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 сигналов, прежде чем продолжить. Одной из форм сигнала может быть создание файла, но есть много вариантов.

Другие вопросы по тегам