web-dev-qa-db-fra.com

Exécution asynchrone des commandes de fichier de commandes Windows

Dis, si j'ai

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

Comment puis-je les exécuter tous à partir d’un fichier de commandes de manière asynchrone, c’est-à-dire sans attendre la fin du programme précédent?

175
RichN

Utiliser la commande START pour exécuter chaque programme devrait vous procurer ce dont vous avez besoin:

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

Chaque invocation START exécute la commande indiquée dans son paramètre et retourne immédiatement, sauf si elle est exécutée avec un commutateur /WAIT.

Cela s'applique aux applications en ligne de commande. De toute façon, les applications sans ligne de commande reviennent immédiatement. Par conséquent, si vous souhaitez exécuter toutes les tâches de manière asynchrone, utilisez START.

238
macbirdie

En combinant quelques réponses précédentes, vous pouvez essayer start /b cmd /c foo.exe.

Par exemple, si vous souhaitez imprimer les versions de Java/groovy/grails/gradle, vous pouvez le faire dans un fichier de traitement par lots:

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

Si vous avez quelque chose comme Process Explorer (Sysinternals), vous verrez quelques processus enfants cmd.exe, chacun avec un processus Java (comme indiqué dans les commandes ci-dessus). La sortie sera imprimée à l'écran dans l'ordre de leur finition.

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
65
djKianoosh

Vous pouvez utiliser la commande start pour générer des processus en arrière-plan sans lancer de nouvelles fenêtres:

start /b foo.exe

Le nouveau processus ne sera pas interrompu avec CTRL-C; vous pouvez le tuer uniquement avec CTRL-BREAK (ou en fermant la fenêtre, ou via le Gestionnaire des tâches.)

35
sproaticus

Créez un fichier de commandes avec les lignes suivantes:

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

Le commande de démarrage exécute votre commande dans une nouvelle fenêtre, les 3 commandes s'exécutant de manière asynchrone.

21
Nikhil

Utilisez le commande START :

start [programPath]

Si le chemin du programme contient des espaces, n'oubliez pas d'ajouter des guillemets. Dans ce cas, vous devez également fournir un titre à la fenêtre de la console qui s'ouvre.

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

Si vous avez besoin de fournir des arguments, ajoutez-les à la fin (en dehors des guillemets de la commande)

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

Utilisez l'option/b pour éviter d'ouvrir une nouvelle fenêtre de console (mais dans ce cas, vous ne pouvez pas interrompre l'application à l'aide de CTRL-C

16
Pierluigi

Il existe une troisième option (et potentiellement beaucoup plus simple). Si vous souhaitez créer plusieurs instances d'un même programme, l'utilisation d'un processeur de commande de style Unix tel que Xargs ou GNU Parallel peut simplifier considérablement ce processus.

Il existe un clone win32 Xargs appelé PPX2 qui rend cela assez simple.

Par exemple, si vous souhaitez transcoder un répertoire de fichiers vidéo, vous pouvez exécuter la commande suivante:

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

En sélectionnant ceci à part, dir /b *.mpg saisit une liste de fichiers .mpg dans mon répertoire actuel, l'opérateur | dirige cette liste dans ppx2, qui crée ensuite une série de commandes à exécuter en parallèle. 4 à la fois, comme spécifié ici par l'opérateur -P 4. L'opérateur -L 1 indique à ppx2 de n'envoyer qu'une ligne de notre liste de répertoires à ffmpeg à la fois.

Ensuite, vous écrivez simplement votre ligne de commande (ffmpeg.exe -i "{}" -quality:v 1 "{}.mp4") et {} est automatiquement remplacé par chaque ligne de votre liste de répertoires.

Ce n'est pas universellement applicable à tous les cas, mais c'est beaucoup plus facile que d'utiliser les solutions de contournement de fichier batch détaillées ci-dessus. Bien sûr, si vous ne travaillez pas avec une liste de fichiers, vous pouvez également diriger le contenu d'un fichier texte ou de tout autre programme dans l'entrée de pxx2.

10
schmod