Say, если у меня естьЗапуск пакетного файла Windows, команды асинхронно
- foo.exe
- bar.exe
- baz.exe
Как запустить все их из пакетный файл асинхронно, т.е. не дожидаясь остановки предыдущей программы?
Say, если у меня естьЗапуск пакетного файла Windows, команды асинхронно
Как запустить все их из пакетный файл асинхронно, т.е. не дожидаясь остановки предыдущей программы?
Использование команды START
для запуска каждой программы должны получить, что вам нужно:
START "title" [/D path] [options] "command" [parameters]
Каждый START
вызов выполняет команды, заданной в параметре и немедленно возвращается, если не выполняется с /WAIT
переключателем.
Это относится к приложениям с командной строкой. Приложения без командной строки немедленно возвращаются, так что, если вы хотите запустить все асинхронно, используйте START
.
Создайте пакетный файл со следующими строками:
start foo.exe
start bar.exe
start baz.exe
start command запускает вашу команду в новом окне, так что все 3 команды будут выполняться асинхронно.
Вы можете использовать команду запуска на нерест фоновых процессов без запуска нового окна:
start /b foo.exe
Нового процесс не будет прерывают с CTRL-C; вы можете убить его только с помощью CTRL-BREAK (или закрытием окна или с помощью диспетчера задач).
Upvote для '' CTRL-BREAK''. –
Где сейчас находится 'BREAK' на клавиатурах? – user2023370
@ user2023370 Все еще на клавише [Пауза] (https://en.wikipedia.org/wiki/File:ANSI_Keyboard_Layout_Diagram_with_Form_Factor.svg). Большинство ноутбуков, которые не имеют определенных ключей, поддерживают [скрытые комбинации клавиш] (https://support.lenovo.com/at/en/documents/ht074004). –
В сочетании с двумя предыдущими ответами вы можете попробовать start /b cmd /c foo.exe
.
Для простого примера, если вы хотите распечатать версии Java/заводной/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
Почему знак @ перед стартом команда? – Leonel
предотвращает повторение эхо-команды на консоль. В пакетных сценариях иногда вы увидите «echo off» в начале, которое при выполнении скрипта предотвратит повторение эхо-команд на консоль. '@' Аналогичен, но только для этой единственной команды. Поэтому иногда вы увидите '@echo off'. – djKianoosh
Есть третий (и, возможно, намного более простой) вариант. Если вы хотите развернуть несколько экземпляров одной программы, использование командного процессора в стиле 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.
Последний порт xargs win32 хорошо работает в наши дни (тот, который включен в git для Windows в любом случае). –
Это замечательно, за исключением того, что он не справляется с файлами, содержащими символы Unicode. Любые планы по поддержке файлов Unicode? Благодарю. –
@ GökhanSever В прошлом я работал над этой проблемой, используя форму «короткого имени», которая выглядит как C: \ PROGRA ~ 1 \ WINDOW ~ 3 \ MYPROG ~ 1.EXE. Не очень, но это работает. – jmnben
Используйте START command:
start [programPath]
Если путь к программе содержит пробелы, не забудьте добавить кавычки. В этом случае также необходимо предоставить название для окна открытия консоли
start "[title]" "[program path]"
Если вам необходимо предоставить аргументы добавить их в конце (за пределами команды кавычки)
start "[title]" "[program path]" [list of command args]
Используйте/б чтобы избежать открытия нового окна консоли (но в этом случае вы не можете прервать приложение, используя CTRL-C
Хорошо, спасибо. Я должен был внимательно прочитать каждую запись 'help'. :) – RichN
У меня действительно были проблемы с этим в другой день. Мне нужно было запустить 30 окон для тестирования производительности. Не работало, и для меня не было достаточно внимания, чтобы посмотреть на него. В этом окне начал работать, а через несколько часов, когда я его закрыл, появился еще один! И я был как то, черт возьми, закрыл его ... другой всплыл! После 4-5 окон и много чего, я заметил, что пакетный файл все еще работает! –
Бесстыдная самореклама: я однажды создал партию, которая может функционировать как своего рода пул потоков, только для процессов: http://stackoverflow.com/questions/672719/parallel-execution-of-shell-processes/676667 # 676667 – Joey