Esecuzione di comandi di file batch di Windows in modo asincrono

Dillo, se ho

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

Come faccio a eseguirli tutti da un file batch in modo asincrono, cioè senza aspettare che il programma precedente si fermi?

Utilizzare il comando START per eseguire ogni programma dovrebbe ottenere quello che ti serve:

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

Ogni invocazione START esegue il comando indicato nel parametro e restituisce immediatamente, a meno che non venga eseguito con un parametro /WAIT .

Questo vale per le app della riga di comando. Le app senza riga di comando ritornano immediatamente ugualmente, quindi per sicurezza, se vuoi eseguire tutto in modo asincrono, usa START .

Combinando un paio delle risposte precedenti, potresti provare start /b cmd /c foo.exe .

Per un semplice esempio, se si desidera stampare le versioni di java / groovy / grails / gradle, è ansible farlo in un file batch:

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

Se avete qualcosa come Process Explorer (Sysinternals), vedrete alcuni processi figlio cmd.exe ciascuno con un processo java (come per i comandi precedenti). L’output verrà stampato sullo schermo in qualsiasi ordine finiscano.

 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 

È ansible utilizzare il comando start per generare processi in background senza avviare nuove windows:

start /b foo.exe

Il nuovo processo non sarà interrompibile con CTRL-C; puoi ucciderlo solo con CTRL-BREAK (o chiudendo la finestra o tramite Task Manager).

Creare un file batch con le seguenti linee:

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

Il comando start esegue il comando in una nuova finestra, quindi tutti e 3 i comandi verrebbero eseguiti in modo asincrono.

Usa il comando START :

 start [programPath] 

Se il percorso del programma contiene spazi, ricorda di aggiungere virgolette. In questo caso è anche necessario fornire un titolo per la finestra della console di apertura

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

Se hai bisogno di fornire argomenti aggiungili alla fine (al di fuori delle virgolette di comando)

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

Utilizzare l’opzione / b per evitare l’apertura di una nuova finestra della console (ma in tal caso non è ansible interrompere l’applicazione utilizzando CTRL-C

C’è una terza opzione (e potenzialmente molto più semplice). Se vuoi far ruotare più istanze di un singolo programma, usare un processore di comando in stile Unix come Xargs o GNU Parallel può renderlo un processo abbastanza semplice.

C’è un clone Xargs Win32 chiamato PPX2 che rende questo abbastanza semplice.

Ad esempio, se si desidera transcodificare una directory di file video, è ansible eseguire il comando:

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

Selezionandolo a parte, dir /b *.mpg prende una lista di file .mpg nella mia directory corrente, i | l’operatore inserisce questa lista in ppx2, che quindi costruisce una serie di comandi da eseguire in parallelo; 4 alla volta, come specificato qui dall’operatore -P 4 . L’operatore -L 1 dice a ppx2 di inviare una sola riga della nostra directory a ffmpeg alla volta.

Dopodiché, scrivi semplicemente la tua riga di comando ( ffmpeg.exe -i "{}" -quality:v 1 "{}.mp4" ), e {} viene automaticamente sostituito per ogni riga della tua lista di directory.

Non è universalmente applicabile a tutti i casi, ma è molto più semplice rispetto all’utilizzo delle soluzioni alternative per i file batch sopra descritte. Naturalmente, se non si ha a che fare con un elenco di file, è ansible anche redirect il contenuto di un file di testo o di qualsiasi altro programma nell’input di pxx2.