Выполнение команд пакетного файла Windows асинхронно
Скажи, если у меня есть
- foo.exe
- bar.exe
- baz.exe
Как я могу запустить их все из пакетного файла асинхронно, т.е. не дожидаясь остановки предыдущей программы?
6 ответов
С использованием START
Команда для запуска каждой программы должна дать вам то, что вам нужно:
START "title" [/D path] [options] "command" [parameters]
каждый START
вызов запускает команду, указанную в ее параметре, и немедленно возвращается, если не выполняется с /WAIT
переключатель.
Это относится к приложениям командной строки. В любом случае приложения без командной строки немедленно возвращаются, поэтому, если вы хотите, чтобы все выполнялось асинхронно, используйте START
,
Сочетая пару предыдущих ответов, вы можете попробовать start /b cmd /c foo.exe
,
Для тривиального примера, если вы хотите распечатать версии java / groovy / grails / gradle, вы можете сделать это в пакетном файле:
@start /b cmd /c java -version
@start /b cmd /c gradle -version
@start /b cmd /c groovy -version
@start /b cmd /c grails -version
Если у вас есть что-то вроде Process Explorer (Sysinternals), вы увидите несколько дочерних процессов cmd.exe, каждый из которых имеет процесс Java (согласно приведенным выше командам). Вывод будет распечатан на экране в любом порядке.
start /b : Start application without creating a new window. The
application has ^C handling ignored. Unless the application
enables ^C processing, ^Break is the only way to interrupt
the application
cmd /c : Carries out the command specified by string and then terminates
Вы можете использовать команду запуска для запуска фоновых процессов без запуска новых окон:
start /b foo.exe
Новый процесс не будет прерываться с помощью CTRL-C; Вы можете убить его только с помощью CTRL-BREAK (или закрыв окно, или через диспетчер задач.)
Создайте командный файл со следующими строками:
start foo.exe
start bar.exe
start baz.exe
Команда запуска запускает вашу команду в новом окне, поэтому все 3 команды будут выполняться асинхронно.
Используйте команду START:
start [programPath]
Если путь к программе содержит пробелы, не забудьте добавить кавычки. В этом случае вам также необходимо указать заголовок открывающегося окна консоли.
start "[title]" "[program path]"
Если вам нужно предоставить аргументы, добавьте их в конце (за пределами кавычек команды)
start "[title]" "[program path]" [list of command args]
Используйте параметр /b, чтобы избежать открытия нового окна консоли (но в этом случае вы не можете прервать приложение, используя CTRL-C
Есть третий (и потенциально гораздо более простой) вариант. Если вы хотите раскрутить несколько экземпляров одной программы, использование командного процессора в стиле Unix, такого как Xargs или GNU Parallel, может сделать этот процесс довольно простым.
Есть клон win32 Xargs под названием PPX2, который делает это довольно просто.
Например, если вы хотите перекодировать каталог видеофайлов, вы можете выполнить команду:
dir /b *.mpg |ppx2 -P 4 -I {} -L 1 ffmpeg.exe -i "{}" -quality:v 1 "{}.mp4"
Разбирая это, dir /b *.mpg
захватывает список файлов.mpg в моем текущем каталоге, |
оператор передает этот список в ppx2, который затем строит серию команд для параллельного выполнения; 4 за один раз, как указано здесь -P 4
оператор. -L 1
оператор сообщает ppx2, что нужно отправлять только одну строку из списка наших каталогов в ffmpeg за раз.
После этого вы просто пишете свою командную строку (ffmpeg.exe -i "{}" -quality:v 1 "{}.mp4"
), а также {}
автоматически подставляется для каждой строки вашего каталога.
Это не универсально применимо к каждому случаю, но намного проще, чем использование обходных путей командного файла, описанных выше. Конечно, если вы не имеете дело со списком файлов, вы также можете передать содержимое текстового файла или любой другой программы на вход pxx2.
Я не мог заставить ничего работать. В итоге я просто использовал powershell для запуска сценариев bat.. иногда даже запуск cmd /c не работает, не знаю почему.. Я даже пробовал такие вещи, как start cmd /c notepad & exit
start-Process "c:\BACKUP\PRIVATE\MobaXterm_Portable\MobaXterm_Portable.bat" -WindowStyle Hidden