Выполнение команд пакетного файла Windows асинхронно - PullRequest
172 голосов
/ 19 сентября 2009

Скажите, если у меня есть

  • foo.exe
  • bar.exe
  • baz.exe

Как мне запустить их все из пакетного файла асинхронно, то есть, не дожидаясь остановки предыдущей программы?

Ответы [ 6 ]

233 голосов
/ 19 сентября 2009

Использование команды START для запуска каждой программы должно дать вам то, что вам нужно:

START "title" [/D path] [options] "command" [parameters]

Каждый вызов START запускает команду, указанную в ее параметре, и немедленно возвращается, если не выполняется с переключателем /WAIT.

Это относится к приложениям командной строки. В любом случае приложения без командной строки немедленно возвращаются, поэтому для уверенности, что если вы хотите запустить все асинхронно, используйте START.

63 голосов
/ 01 июня 2012

Комбинируя пару предыдущих ответов, вы можете попробовать 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
35 голосов
/ 21 сентября 2009

Вы можете использовать команду запуска для запуска фоновых процессов без запуска новых окон:

start /b foo.exe

Новый процесс не будет прерываться с помощью CTRL-C; Вы можете убить его только с помощью CTRL-BREAK (или закрыв окно, или через диспетчер задач.)

21 голосов
/ 19 сентября 2009

Создайте командный файл со следующими строками:

start foo.exe
start bar.exe
start baz.exe 

Команда start запускает вашу команду в новом окне, поэтому все 3 команды будут выполняться асинхронно.

16 голосов
/ 09 июля 2014

Используйте команду START :

start [programPath]

Если путь к программе содержит пробелы, не забудьте добавить кавычки. В этом случае вам также необходимо указать заголовок открывающегося консольного окна

start "[title]" "[program path]"

Если вам нужно предоставить аргументы, добавьте их в конце (за пределами кавычек команды)

start "[title]" "[program path]" [list of command args]

Используйте параметр / b, чтобы не открывать новое окно консоли (но в этом случае вы не можете прервать приложение с помощью CTRL-C

10 голосов
/ 23 августа 2012

Есть третий (и, возможно, гораздо более простой) вариант. Если вы хотите раскрутить несколько экземпляров одной программы, использование командного процессора в стиле 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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...