Асинхронный запуск команд командного файла Windows

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

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

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


person RichN    schedule 19.09.2009    source источник


Ответы (7)


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

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

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

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

person macbirdie    schedule 19.09.2009
comment
Хорошо спасибо. Я должен был внимательно прочитать каждую запись help. :) - person RichN; 19.09.2009
comment
На днях у меня действительно были проблемы с этим. Мне пришлось запустить 30 окон проводника для теста производительности. Не сработало, и это было недостаточно важно для меня, чтобы разобраться в этом ... вместо этого начал просматривать в этом окне, а через несколько часов, когда я его закрыл, появилось еще одно! И мне понравилось что, черт возьми, закрыл его .. выскочил еще один! После 4-5 окон и многого, черт возьми, я заметил, что пакетный файл все еще работает! - person Jonas B; 19.09.2009
comment
Бесстыдная самореклама: однажды я создал пакет, который может функционировать как своего рода пул потоков только для процессов: stackoverflow.com/questions/672719/ - person Joey; 20.09.2009
comment
Если вам нужно предоставить аргументы или если путь к командам содержит пробелы, не забудьте добавить кавычки. В этом случае вам также необходимо указать заголовок для открывающегося окна консоли: start [путь к команде] [аргументы команды] - person Pierluigi; 09.07.2014
comment
Можно ли с помощью этой техники определить, когда это будет сделано? Я начинаю около 30 копий FILA DESTA и хочу, чтобы они были асинхронными, но я также хочу иметь некоторое представление, когда они все будут готовы. - person Doug; 17.07.2017
comment
Здорово! Теперь я знаю, как запускать скрипты Python в пакетном режиме! - person ivan866; 26.02.2020
comment
Приведите пример .. все эти необязательные параметры очень беспокоят .. параметры параметры путь .. - person Max; 26.03.2020
comment
Успех. ЗАПУСТИТЕ VMPlayer / D C: \ Users \ gavin \ Virtual Machines \ CentOS 8 64-бит C: \ Program Files (x86) \ VMware \ VMware Player \ vmplayer.exe - person Switch; 28.09.2020

Объединив пару предыдущих ответов, вы можете попробовать 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
person djKianoosh    schedule 01.06.2012
comment
он предотвращает вывод команды на консоль. В пакетных сценариях иногда вы увидите echo off в начале, что при выполнении сценария предотвратит вывод всех команд на консоль. @ аналогичен, но только для этой единственной команды. Так что иногда вы увидите @echo off. - person djKianoosh; 29.02.2016
comment
У меня не получилось. Все еще перестал ждать закрытия приложения, прежде чем двигаться дальше. - person Switch; 28.09.2020

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

start /b foo.exe

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

person sproaticus    schedule 21.09.2009
comment
Где сейчас BREAK на клавиатурах? - person user2023370; 10.01.2016
comment
@ user2023370 По-прежнему нажимает кнопку Пауза. Большинство ноутбуков, на которых отсутствуют определенные клавиши, поддерживают скрытые комбинации клавиш. - person Gerold Broser; 08.05.2016
comment
У меня не получилось. Все еще перестал ждать закрытия приложения, прежде чем двигаться дальше. - person Switch; 28.09.2020

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

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

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

person Nikhil    schedule 19.09.2009
comment
работает до тех пор, пока у вас нет пути с пробелами ... Затем, когда вы заключаете его в двойные кавычки, он думает в заголовке, а не в приложении. Это работает. ЗАПУСТИТЕ VMPlayer / D C: \ Users \ gavin \ Virtual Machines \ CentOS 8 64-бит C: \ Program Files (x86) \ VMware \ VMware Player \ vmplayer.exe - person Switch; 28.09.2020

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

start [programPath]

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

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

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

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

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

person Pierluigi    schedule 09.07.2014

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

person schmod    schedule 23.08.2012
comment
Последний порт xargs win32 работает хорошо в настоящее время (в любом случае тот, который включен в git для Windows). - person Peter M; 14.11.2014
comment
Это замечательно, за исключением того, что не работает с файлами, содержащими символы Юникода. Есть ли планы по поддержке файлов Unicode? Спасибо. - person Gökhan Sever; 18.11.2014
comment
@ GökhanSever Раньше я работал над этой проблемой, используя краткую форму имени пути, которая выглядит как C: \ PROGRA ~ 1 \ WINDOW ~ 3 \ MYPROG ~ 1.EXE. Не очень красиво, но работает. - person moltenform; 07.01.2017

Я не мог заставить ничего работать. В итоге я просто использовал powershell для запуска сценариев bat .. иногда даже запуск cmd / c не работает, не знаю почему .. Я даже пробовал такие вещи, как start cmd / c notepad & exit

start-Process "c:\BACKUP\PRIVATE\MobaXterm_Portable\MobaXterm_Portable.bat" -WindowStyle Hidden
person RmccurdyDOTcom    schedule 30.12.2019