2009-09-19 4 views

ответ

206

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

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

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

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

+0

Хорошо, спасибо. Я должен был внимательно прочитать каждую запись 'help'. :) – RichN

+7

У меня действительно были проблемы с этим в другой день. Мне нужно было запустить 30 окон для тестирования производительности. Не работало, и для меня не было достаточно внимания, чтобы посмотреть на него. В этом окне начал работать, а через несколько часов, когда я его закрыл, появился еще один! И я был как то, черт возьми, закрыл его ... другой всплыл! После 4-5 окон и много чего, я заметил, что пакетный файл все еще работает! –

+2

Бесстыдная самореклама: я однажды создал партию, которая может функционировать как своего рода пул потоков, только для процессов: http://stackoverflow.com/questions/672719/parallel-execution-of-shell-processes/676667 # 676667 – Joey

21

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

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

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

26

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

start /b foo.exe

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

+0

Upvote для '' CTRL-BREAK''. –

+1

Где сейчас находится 'BREAK' на клавиатурах? – user2023370

+0

@ user2023370 Все еще на клавише [Пауза] (https://en.wikipedia.org/wiki/File:ANSI_Keyboard_Layout_Diagram_with_Form_Factor.svg). Большинство ноутбуков, которые не имеют определенных ключей, поддерживают [скрытые комбинации клавиш] (https://support.lenovo.com/at/en/documents/ht074004). –

56

В сочетании с двумя предыдущими ответами вы можете попробовать 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 
+0

Почему знак @ перед стартом команда? – Leonel

+7

предотвращает повторение эхо-команды на консоль. В пакетных сценариях иногда вы увидите «echo off» в начале, которое при выполнении скрипта предотвратит повторение эхо-команд на консоль. '@' Аналогичен, но только для этой единственной команды. Поэтому иногда вы увидите '@echo off'. – djKianoosh

9

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

+1

Последний порт xargs win32 хорошо работает в наши дни (тот, который включен в git для Windows в любом случае). –

+0

Это замечательно, за исключением того, что он не справляется с файлами, содержащими символы Unicode. Любые планы по поддержке файлов Unicode? Благодарю. –

+0

@ GökhanSever В прошлом я работал над этой проблемой, используя форму «короткого имени», которая выглядит как C: \ PROGRA ~ 1 \ WINDOW ~ 3 \ MYPROG ~ 1.EXE. Не очень, но это работает. – jmnben

12

Используйте START command:

start [programPath] 

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

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

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

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

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

Смежные вопросы