Скажем, если у меня
- foo.exe
- bar.exe
- baz.exe
Как я могу запустить все их из пакетного файла асинхронно, т.е. не дожидаясь остановки предыдущей программы?
Скажем, если у меня
Как я могу запустить все их из пакетного файла асинхронно, т.е. не дожидаясь остановки предыдущей программы?
Используя команду 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 для создания фоновых процессов без запуска новых окон:
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.