[Batch-File] Esecuzione di comandi di file batch di Windows in modo asincrono


Answers

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, è possibile 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
Question

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?




Creare un file batch con le seguenti linee:

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

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




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, è possibile 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, è possibile anche reindirizzare il contenuto di un file di testo o di qualsiasi altro programma nell'input di pxx2.




Links