Esecuzione asincrona dei comandi dei file batch di Windows


187

Di ', se ho

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

Come eseguirli tutti da un file batch in modo asincrono, ovvero senza attendere l'arresto del programma precedente?

Risposte:


254

L'uso del STARTcomando per eseguire ciascun programma dovrebbe fornirti ciò di cui hai bisogno:

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

Ogni STARTinvocazione esegue il comando indicato nel suo parametro e restituisce immediatamente, a meno che non venga eseguito con a/WAIT interruttore.

Questo vale per le app della riga di comando. Le app senza riga di comando tornano comunque immediatamente, quindi per essere sicuri, se vuoi eseguire tutte in modo asincrono, usa START.


Va bene, grazie. Avrei dovuto leggere helpattentamente ogni voce . :)
RichN

8
In realtà ho avuto problemi con questo l'altro giorno. Ho dovuto avviare 30 finestre di Explorer per un test delle prestazioni. Non ha funzionato e non è stato abbastanza importante per me guardarlo .. ho iniziato a navigare invece in quella finestra e diverse ore dopo quando l'ho chiuso, ne è comparso un altro! Ed ero come diavolo, l'ho chiuso .. ne è uscito un altro! Dopo 4-5 finestre e molto di ciò che il **** ho notato il file batch ancora in esecuzione!
Jonas B,

3
Auto-pubblicità spudorata: una volta ho creato un batch in grado di funzionare come una sorta di pool di thread, solo per i processi: stackoverflow.com/questions/672719/…
Joey,

4
Se è necessario fornire argomenti o se il percorso dei comandi contiene spazi, ricordare di aggiungere virgolette. In questo caso devi anche fornire un titolo per la finestra della console di apertura: start "" "[percorso al comando]" [comando args]
Pierluigi,

C'è un modo per dire con questa tecnica quando è fatto? Sto dando il via a ~ 30 copie di FILA DESTA e voglio che siano asincrone, ma voglio anche avere qualche idea quando avranno finito.
Doug,

68

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

Per un banale 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 hai qualcosa come Process Explorer (Sysinternals), vedrai alcuni processi cmd.exe figlio ciascuno con un processo java (secondo i comandi sopra). L'output verrà stampato sullo schermo nell'ordine in cui terminano.

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

13
impedisce che il comando venga ripetuto nella console. Negli script batch, a volte vedrai echo offall'inizio che, quando esegui lo script, impedirà che tutti i comandi vengano ripetuti nella console. L' @è simile, ma solo per questo singolo comando. Quindi, a volte vedrai @echo off.
djKianoosh,

36

Puoi usare il comando start per generare processi in background senza avviare nuove finestre:

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.)


5
Dove sono le BREAKtastiere in questi giorni?
user2023370

1
@ user2023370 Sempre sul tasto Pausa . La maggior parte dei laptop a cui mancano determinati tasti supporta combinazioni di tasti nascosti .
Gerold Broser,


23

Creare un file batch con le seguenti righe:

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.


17

Utilizzare il comando START :

start [programPath]

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

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

Se è necessario fornire argomenti aggiungerli alla fine (al di fuori delle virgolette del 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 è possibile interrompere l'applicazione utilizzando CTRL-C


10

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

C'è un clone Xargs win32 chiamato PPX2 che lo rende 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"

Selezionando questo, dir /b *.mpgprende un elenco di file .mpg nella mia directory corrente, l' |operatore reindirizza questo elenco in ppx2, che quindi crea una serie di comandi da eseguire in parallelo; 4 alla volta, come specificato qui -P 4dall'operatore. Il-L 1 operatore dice a ppx2 di inviare solo una riga del nostro elenco di 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 del tuo elenco di directory.

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


1
L'ultima porta xargs win32 funziona bene al giorno d'oggi (quella inclusa con git per Windows comunque).
Peter M,

Questo è fantastico, tranne per il fatto che non riesce a gestire i file contenenti caratteri Unicode. Hai in programma di supportare file unicode? Grazie.
Gökhan Sever,

@ GökhanSever In passato ho risolto questo problema utilizzando la forma "short name" del percorso, che assomiglia a C: \ PROGRA ~ 1 \ WINDOW ~ 3 \ MYPROG ~ 1.EXE. Non carino, ma funziona.
Moltenform

-1

Non riuscivo a far funzionare nulla, alla fine ho usato PowerShell per avviare gli script di pipistrello .. a volte anche avviare cmd / c non funziona non so perché .. Ho anche provato cose come avviare il blocco note di cmd / c ed uscire

start-Process "c:\BACKUP\PRIVATE\MobaXterm_Portable\MobaXterm_Portable.bat" -WindowStyle Hidden
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.