Ausführen von Windows-Batchdateibefehlen asynchron

186

Sag, wenn ich habe

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

Wie führe ich sie alle asynchron aus einer Batchdatei aus, ohne darauf zu warten, dass das vorherige Programm beendet wird?

RichN
quelle

Antworten:

254

Wenn Sie den STARTBefehl zum Ausführen jedes Programms verwenden, erhalten Sie das, was Sie benötigen:

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

Jeder STARTAufruf führt den in seinem Parameter angegebenen Befehl aus und kehrt sofort zurück, sofern er nicht mit einem /WAITSchalter ausgeführt wird.

Das gilt für Kommandozeilen-Apps. Apps ohne Befehlszeile kehren ohnehin sofort zurück. Wenn Sie also alle asynchron ausführen möchten, verwenden Sie START.

Macbirdie
quelle
Okay danke. Ich hätte jeden Eintrag helpsorgfältig lesen sollen . :)
RichN
8
Ich hatte neulich tatsächlich Probleme damit. Ich musste 30 Explorer-Fenster für einen Leistungstest starten. Hat nicht funktioniert und es war nicht wichtig genug für mich, es zu untersuchen. Stattdessen habe ich mich in diesem Fenster umgesehen und einige Stunden später, als ich es geschlossen habe, ist ein anderes aufgetaucht! Und ich war wie was zum Teufel, schloss es ... ein anderes tauchte auf! Nach 4-5 Fenstern und vielem, was zum ****, bemerkte ich, dass die Batchdatei immer noch läuft!
Jonas B
3
Schamlose Eigenwerbung: Ich habe einmal einen Stapel erstellt, der als eine Art Thread-Pool fungieren kann, nur für Prozesse: stackoverflow.com/questions/672719/…
Joey
4
Wenn Sie Argumente angeben müssen oder wenn der Pfad zu den Befehlen Leerzeichen enthält, müssen Sie Anführungszeichen hinzufügen. In diesem Fall müssen Sie auch einen Titel für das sich öffnende Konsolenfenster angeben: start "" [Pfad zum Befehl] "[Befehlsargumente]
Pierluigi
Gibt es eine Möglichkeit, mit dieser Technik zu erkennen, wann sie fertig ist? Ich starte ~ 30 Kopien von FILA DESTA und möchte, dass sie asynchron sind, aber ich möchte auch eine Idee haben, wenn sie alle fertig sind.
Doug
68

Wenn Sie einige der vorherigen Antworten kombinieren, können Sie es versuchen start /b cmd /c foo.exe.

Wenn Sie als einfaches Beispiel die Versionen von Java / Groovy / Grails / Gradle ausdrucken möchten, können Sie dies in einer Batch-Datei tun:

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

Wenn Sie so etwas wie Process Explorer (Sysinternals) haben, werden einige untergeordnete cmd.exe-Prozesse mit jeweils einem Java-Prozess angezeigt (gemäß den obigen Befehlen). Die Ausgabe wird in beliebiger Reihenfolge auf dem Bildschirm gedruckt.

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
quelle
13
Es verhindert, dass der Befehl an die Konsole zurückgegeben wird. In Batch-Skripten sehen Sie manchmal echo offam Anfang, was beim Ausführen des Skripts verhindert, dass alle Befehle an die Konsole zurückgegeben werden. Das @ist ähnlich, aber nur für diesen einzelnen Befehl. Also, manchmal wirst du sehen @echo off.
DJKianoosh
36

Mit dem Befehl start können Sie Hintergrundprozesse erzeugen, ohne neue Fenster zu starten:

start /b foo.exe

Der neue Prozess kann mit STRG-C nicht unterbrochen werden. Sie können es nur mit STRG-BREAK beenden (oder durch Schließen des Fensters oder über den Task-Manager).

sproaticus
quelle
5
Wo ist BREAKin diesen Tagen auf Tastaturen?
user2023370
1
@ user2023370 Immer noch auf der Pause- Taste. Die meisten Laptops ohne bestimmte Schlüssel unterstützen versteckte Tastenkombinationen .
GeroldBroser setzt Monica
23

Erstellen Sie eine Batchdatei mit den folgenden Zeilen:

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

Der Befehl start führt Ihren Befehl in einem neuen Fenster aus, sodass alle drei Befehle asynchron ausgeführt werden.

Nikhil
quelle
17

Verwenden Sie den Befehl START :

start [programPath]

Wenn der Pfad zum Programm Leerzeichen enthält, müssen Sie Anführungszeichen hinzufügen. In diesem Fall müssen Sie auch einen Titel für das sich öffnende Konsolenfenster angeben

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

Wenn Sie Argumente angeben müssen, fügen Sie diese am Ende hinzu (außerhalb der Anführungszeichen).

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

Verwenden Sie die Option / b, um das Öffnen eines neuen Konsolenfensters zu vermeiden (in diesem Fall können Sie die Anwendung jedoch nicht mit STRG-C unterbrechen

Pierluigi
quelle
10

Es gibt eine dritte (und möglicherweise viel einfachere) Option. Wenn Sie mehrere Instanzen eines einzelnen Programms starten möchten, kann die Verwendung eines Unix-Befehlsprozessors wie Xargs oder GNU Parallel dies zu einem recht einfachen Vorgang machen.

Es gibt einen win32 Xargs-Klon namens PPX2 , der dies ziemlich einfach macht.

Wenn Sie beispielsweise ein Verzeichnis von Videodateien transkodieren möchten, können Sie den folgenden Befehl ausführen:

dir /b *.mpg |ppx2 -P 4 -I {} -L 1 ffmpeg.exe -i "{}" -quality:v 1 "{}.mp4"

Wenn Sie dies auseinander nehmen, wird dir /b *.mpgeine Liste von MPG-Dateien in meinem aktuellen Verzeichnis abgerufen. Der |Operator leitet diese Liste an ppx2 weiter, das dann eine Reihe von Befehlen erstellt, die parallel ausgeführt werden sollen. 4 auf einmal, wie hier vom -P 4Betreiber angegeben. Der -L 1Operator weist ppx2 an, jeweils nur eine Zeile unserer Verzeichnisliste an ffmpeg zu senden.

Danach schreiben Sie einfach Ihre Befehlszeile ( ffmpeg.exe -i "{}" -quality:v 1 "{}.mp4") und werden {}automatisch für jede Zeile Ihrer Verzeichnisliste ersetzt.

Es ist nicht in jedem Fall universell anwendbar, aber viel einfacher als die oben beschriebenen Problemumgehungen für Batchdateien. Wenn Sie sich nicht mit einer Liste von Dateien befassen, können Sie natürlich auch den Inhalt einer Textdatei oder eines anderen Programms in die Eingabe von pxx2 einfügen.

schmod
quelle
1
Der neueste xargs win32-Port funktioniert heutzutage gut (der mit git für Windows sowieso enthaltene).
Peter M
Dies ist großartig, außer dass es sich nicht um Dateien handelt, die Unicode-Zeichen enthalten. Pläne zur Unterstützung von Unicode-Dateien? Vielen Dank.
Gökhan Sever
@ GökhanSever In der Vergangenheit habe ich dieses Problem umgangen, indem ich die "Kurznamen" -Form des Pfads verwendet habe, die wie folgt aussieht: C: \ PROGRA ~ 1 \ WINDOW ~ 3 \ MYPROG ~ 1.EXE. Nicht schön, aber es funktioniert.
geschmolzene Form
-1

Ich konnte nichts zum Laufen bringen. Am Ende habe ich nur Powershell verwendet, um Bat-Skripte zu starten. Manchmal funktioniert sogar das Starten von cmd / c nicht sicher, warum. Ich habe sogar Dinge wie start cmd / c notepad & exit ausprobiert

start-Process "c:\BACKUP\PRIVATE\MobaXterm_Portable\MobaXterm_Portable.bat" -WindowStyle Hidden
RmccurdyDOTcom
quelle