Asynchroniczne uruchamianie poleceń pliku wsadowego systemu Windows

187

Powiedz, jeśli mam

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

Jak uruchomić je wszystkie z pliku wsadowego asynchronicznie, tzn. Bez czekania na zatrzymanie się poprzedniego programu?

RichN
źródło

Odpowiedzi:

254

Użycie STARTpolecenia do uruchomienia każdego programu powinno zapewnić ci to, czego potrzebujesz:

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

Każde STARTwywołanie uruchamia polecenie podane w parametrze i natychmiast zwraca, chyba że zostanie wykonane /WAITprzełącznikiem.

Dotyczy to aplikacji wiersza polecenia. Aplikacje bez wiersza polecenia i tak natychmiast wracają, więc aby się upewnić, jeśli chcesz uruchomić wszystko asynchronicznie, użyj START.

macbirdie
źródło
Ok, dzięki. Powinienem był helpuważnie przeczytać każdy wpis . :)
RichN
8
Pewnego dnia miałem z tym problem. Musiałem uruchomić 30 okien eksploratora do testu wydajności. Nie działało i nie było dla mnie wystarczająco ważne, aby się temu przyjrzeć. Zamiast tego zacząłem przeglądać w tym oknie, a kilka godzin później, kiedy je zamknąłem, pojawiło się kolejne! I byłem jak do diabła, zamknąłem to ... wyskoczyło kolejne! Po 4-5 oknach i wielu tym, co **** zauważyłem, plik wsadowy wciąż działa!
Jonas B,
3
Bezwstydna samo-reklama: Kiedyś stworzyłem partię, która może funkcjonować jako rodzaj puli wątków, tylko dla procesów: stackoverflow.com/questions/672719/…
Joey,
4
Jeśli musisz podać argumenty lub ścieżka do poleceń zawiera spacje, pamiętaj o dodaniu cudzysłowów. W tym przypadku musisz także podać tytuł otwierającego okna konsoli: start „” „[ścieżka do polecenia]” [argumenty poleceń]
Pierluigi
Czy jest jakiś sposób na określenie tej techniki? Rozpoczynam ~ 30 kopiowanie FILA DESTA i chcę, żeby były asynchroniczne, ale chcę też mieć pewien pomysł, kiedy wszystko się skończy.
Doug
68

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

Na przykład, 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ś takiego jak Process Explorer (Sysinternals), zobaczysz kilka potomnych procesów cmd.exe, każdy z procesem java (zgodnie z powyższymi poleceniami). Dane wyjściowe zostaną 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
djKianoosh
źródło
13
zapobiega wysyłaniu polecenia do konsoli. W skryptach wsadowych czasami zobaczysz echo offna początku, które po uruchomieniu skryptu zapobiegną odbiciu wszystkich poleceń na konsoli. @Jest podobny, ale tylko dla tego jednego polecenia. Czasami więc zobaczysz @echo off.
djKianoosh
36

Możesz użyć polecenia start, aby spawnować 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ń).

sproaticus
źródło
5
Gdzie jest obecnie BREAKklawiatura?
user2023370,
1
@ user2023370 Nadal na klawiszu pauzy . Większość laptopów, które nie mają określonych kluczy, obsługują ukryte kombinacje klawiszy .
GeroldBroser przywraca Monikę
23

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

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

Polecenie start uruchamia polecenie w nowym oknie, aby wszystkie 3 polecenia działały asynchronicznie.

Nikhil
źródło
17

Użyj polecenia START :

start [programPath]

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

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

Jeśli musisz podać argumenty, dołącz 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żna przerwać aplikacji za pomocą CTRL-C

Pierluigi
źródło
10

Istnieje trzecia (i potencjalnie znacznie łatwiejsza) opcja. Jeśli chcesz rozdzielić wiele wystąpień jednego programu, użycie procesora poleceń w stylu uniksowym, takiego jak Xargs lub GNU Parallel, może uczynić ten proces dość prostym.

Istnieje klon Xargs win32 o nazwie PPX2, który czyni to dość prostym.

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"

Po oddzieleniu tego, dir /b *.mpgpobiera listę plików .mpg w moim bieżącym katalogu, |operator przesyła tę listę do ppx2, który następnie buduje serię poleceń do wykonania równoległego; 4 na raz, jak określono tutaj przez -P 4operatora. -L 1Operator mówi ppx2 aby wysłać tylko jedną linię naszego katalogu nieruchomość ffmpeg naraz.

Następnie wystarczy napisać wiersz poleceń ( ffmpeg.exe -i "{}" -quality:v 1 "{}.mp4") i {}zostanie automatycznie podstawiony dla każdego wiersza listy katalogów.

Nie jest to uniwersalne zastosowanie do każdego przypadku, ale jest o wiele łatwiejsze niż użycie opisanych powyżej obejść pliku wsadowego. Oczywiście, jeśli nie masz do czynienia z listą plików, możesz również potokować zawartość pliku tekstowego lub innego programu do wejścia pxx2.

schmod
źródło
1
Najnowszy port winarga xargs działa obecnie dobrze (ten i tak jest dołączony do git dla Windows).
Peter M
Jest to świetne, z tym wyjątkiem, że nie radzi sobie z plikami zawierającymi znaki Unicode. Jakieś plany obsługi plików Unicode? Dzięki.
Gökhan Sever
@ GökhanSever W przeszłości omawiałem ten problem, używając ścieżki „skróconej nazwy”, która wygląda jak C: \ PROGRA ~ 1 \ WINDOW ~ 3 \ MYPROG ~ 1.EXE. Nie ładnie, ale działa.
stopiony formularz
-1

Nie mogłem dostać niczego do pracy Skończyło się na tym, że używałem programu PowerShell do uruchamiania skryptów bat .. Czasami nawet uruchomienie cmd / c nie działa, nie wiem dlaczego .. Próbowałem nawet takich rzeczy, jak uruchomienie cmd / c Notatnik i wyjście

start-Process "c:\BACKUP\PRIVATE\MobaXterm_Portable\MobaXterm_Portable.bat" -WindowStyle Hidden
RmccurdyDOTcom
źródło