Asynchronicznie Uruchamianie poleceń plików wsadowych systemu Windows

Say, if I have

  • foo.exe
  • Bar.exe Baz.exe

Jak uruchomić wszystkie z pliku wsadowego asynchronicznie, tzn. bez czekania na zatrzymanie poprzedniego programu?

Author: Peter Mortensen, 2009-09-19

6 answers

Za pomocą START polecenie do uruchomienia każdego programu powinno dać ci to, czego potrzebujesz:

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

Każde wywołanie START uruchamia polecenie podane w parametrze i natychmiast powraca, chyba że zostanie wykonane za pomocą przełącznika /WAIT.

Dotyczy to aplikacji wiersza poleceń. Aplikacje bez wiersza poleceń i tak zwracają się natychmiast, więc dla pewności, jeśli chcesz uruchomić wszystkie asynchronicznie, użyj START.

 218
Author: macbirdie,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-11-21 16:30:45

Łącząc kilka poprzednich odpowiedzi, możesz spróbować start /b cmd /c foo.exe.

Dla trywialnego przykładu, jeśli chcesz wydrukować wersje java / groovy / grails / gradle, możesz to zrobić w pliku wsadowym:

@start /b cmd /c java -version
@start /b cmd /c gradle -version
@start /b cmd /c groovy -version
@start /b cmd /c grails -version

Jeśli masz coś w rodzaju Process Explorer (Sysinternals), zobaczysz kilka cmd potomnych.exe przetwarza każdy z procesów java (zgodnie z powyższymi poleceniami). Wyjście zostanie wydrukowane na ekranie w dowolnej kolejności.

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
 57
Author: djKianoosh,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-06-01 16:35:08

Możesz użyć polecenia start, aby odradzać procesy w tle bez uruchamiania nowych okien:

start /b foo.exe

Nowy proces nie będzie przerywany za pomocą CTRL - C; możesz go zabić tylko za pomocą CTRL-BREAK (lub zamykając okno lub za pomocą Menedżera zadań.)

 32
Author: sproaticus,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-09-21 16:37:20

Utwórz plik wsadowy z następującymi liniami:

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

Polecenie start uruchamia Twoje polecenie w nowym oknie, więc wszystkie 3 polecenia będą działać asynchronicznie.

 21
Author: Nikhil,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-09-19 18:44:55

Użyj polecenie START :

start [programPath]

Jeśli ścieżka do programu zawiera spacje, pamiętaj o dodaniu cudzysłowów. W tym przypadku musisz również podać tytuł okna otwierającego konsolę

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

Jeśli chcesz podać argumenty, dodaj je na końcu (poza cudzysłowami poleceń)

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

Użyj opcji /b, aby uniknąć otwierania nowego okna konsoli (ale w takim przypadku nie możesz przerwać aplikacji za pomocą CTRL-C

 13
Author: Pierluigi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-10-02 07:42:12

Jest trzecia (i potencjalnie znacznie łatwiejsza) opcja. Jeśli chcesz uruchomić wiele instancji jednego programu, użycie uniksowego procesora poleceń, takiego jak Xargs lub GNU Parallel, może uczynić to dość prostym procesem.

Istnieje klon win32 xargs o nazwie PPX2 , który sprawia, że jest to dość proste.

Na przykład, jeśli chcesz transkodować katalog plików wideo, możesz uruchomić polecenie:

dir /b *.mpg |ppx2 -P 4 -I {} -L 1 ffmpeg.exe -i "{}" -quality:v 1 "{}.mp4"
/ Align = "left" / lista .pliki mpg w moim bieżącym katalogu, operator | łączy tę listę do ppx2, który następnie buduje serię poleceń, które mają być wykonywane równolegle; 4 na raz, jak określono tutaj przez operatora -P 4. Operator -L 1 mówi ppx2 aby wysyłał tylko jedną linijkę naszej listy katalogowej do ffmpeg na raz.

Po tym, po prostu piszesz wiersz poleceń (ffmpeg.exe -i "{}" -quality:v 1 "{}.mp4"), a {} jest automatycznie zastępowany dla każdej linii listy katalogów.

To nie jest uniwersalne ma zastosowanie w każdym przypadku, ale jest o wiele łatwiejsze niż korzystanie z obejść plików wsadowych opisanych powyżej. Oczywiście, jeśli nie masz do czynienia z listą plików, możesz również wrzucić zawartość pliku tekstowego lub innego programu do wejścia pxx2.

 10
Author: schmod,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-08-23 15:28:16