Выполнение команд командного файла Windows асинхронно

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

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

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

Ответ 1

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

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

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

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

Ответ 2

Объединяя пару предыдущих ответов, вы можете попробовать 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

Ответ 3

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

start /b foo.exe

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

Ответ 5

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

start [programPath]

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

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

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

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

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

Ответ 6

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