Dites, si jeExécution de fichier batch commandes de Windows de manière asynchrone
- foo.exe
- bar.exe
- baz.exe
Comment puis-je exécuter tous d'une fichier batch de manière asynchrone, c'est-à-dire sans attendre l'arrêt du programme précédent?
Dites, si jeExécution de fichier batch commandes de Windows de manière asynchrone
Comment puis-je exécuter tous d'une fichier batch de manière asynchrone, c'est-à-dire sans attendre l'arrêt du programme précédent?
En utilisant la commande START
pour exécuter chaque programme devrait vous obtenir ce dont vous avez besoin:
START "title" [/D path] [options] "command" [parameters]
Chaque invocation START
exécute la commande donnée dans son paramètre et retourne immédiatement, à moins exécuté avec un interrupteur /WAIT
.
Cela s'applique aux applications de ligne de commande. Les applications sans ligne de commande renvoient tout de même immédiatement, donc pour être sûr, si vous voulez exécuter tout de manière asynchrone, utilisez START
.
Créer un fichier de commandes avec les lignes suivantes:
start foo.exe
start bar.exe
start baz.exe
Le start command exécute votre commande dans une nouvelle fenêtre, donc les 3 commandes courraient de manière asynchrone.
Vous pouvez utiliser la commande de démarrage pour engendrer des processus d'arrière-plan sans lancer de nouvelles fenêtres:
start /b foo.exe
Le nouveau processus ne sera pas interruptible avec CTRL-C; vous pouvez le tuer uniquement avec CTRL-BREAK (ou en fermant la fenêtre, ou via le Gestionnaire des tâches.)
Upvote pour '' CTRL-BREAK''. –
Où est "BREAK" sur les claviers ces jours-ci? – user2023370
@ user2023370 Toujours sur la touche [Pause] (https://en.wikipedia.org/wiki/File:ANSI_Keyboard_Layout_Diagram_with_Form_Factor.svg). La plupart des ordinateurs portables qui ne disposent pas de certaines clés prennent en charge [combinaisons de touches cachées] (https://support.lenovo.com/at/fr/documents/ht074004). –
En combinant quelques réponses précédentes, vous pouvez essayer start /b cmd /c foo.exe
.
Pour un exemple trivial, si vous vouliez imprimer les versions de Java/Groovy/Grails/gradle, vous pouvez le faire dans un fichier 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
Si vous avez quelque chose comme Process Explorer (Sysinternals), vous verrez quelques processus de cmd.exe enfant chacun avec un processus java (selon les commandes ci-dessus). La sortie imprimera à l'écran dans n'importe quel ordre.
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
Pourquoi le signe @ avant le début commande? – Leonel
empêche la commande d'être répercutée sur la console. Dans les scripts batch, vous verrez parfois 'echo off' au début qui, lorsque vous exécutez le script, empêchera toutes les commandes d'être renvoyées à la console. Le '@' est similaire mais juste pour cette seule commande. Ainsi, vous verrez parfois '@echo off'. – djKianoosh
Il existe une troisième option (et potentiellement beaucoup plus facile). Si vous souhaitez générer plusieurs instances d'un seul programme, l'utilisation d'un processeur de commandes de type Unix tel que Xargs ou GNU Parallel peut simplifier ce processus.
Il y a un clone Xargs de win32 appelé PPX2 qui rend ceci assez simple.
Par exemple, si vous vouliez transcoder un répertoire de fichiers vidéo, vous pouvez exécuter la commande:
dir /b *.mpg |ppx2 -P 4 -I {} -L 1 ffmpeg.exe -i "{}" -quality:v 1 "{}.mp4"
Reprenant cette part, dir /b *.mpg
saisit une liste.fichiers mpg dans mon répertoire courant, l'opérateur |
redirige cette liste vers ppx2, qui construit 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
dit à ppx2 d'envoyer une seule ligne de notre liste de répertoires à ffmpeg à la fois. Après cela, vous venez d'écrire 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 par lots détaillées ci-dessus. Bien sûr, si vous n'avez pas affaire à une liste de fichiers, vous pouvez aussi rediriger le contenu d'un fichier texte ou d'un autre programme vers l'entrée de pxx2.
Le dernier port xargs win32 fonctionne bien de nos jours (celui inclus avec git pour Windows de toute façon). –
C'est génial, sauf qu'il ne gère pas les fichiers contenant des caractères Unicode. Des plans pour soutenir les fichiers Unicode? Merci. –
@ GökhanSever Dans le passé, j'ai travaillé sur ce problème en utilisant la forme "short name" du chemin, qui ressemble à C: \ PROGRA ~ 1 \ WINDOW ~ 3 \ MYPROG ~ 1.EXE. Ce n'est pas beau, mais ça marche. – jmnben
Utilisez le START command:
start [programPath]
Si le chemin d'accès au programme contient des espaces se rappeler d'ajouter des guillemets. Dans ce cas, vous devez également fournir un titre pour la fenêtre de la console d'ouverture
start "[title]" "[program path]"
Si vous devez fournir des arguments les ajouter à la fin (en dehors des citations de commande)
start "[title]" "[program path]" [list of command args]
Utilisez le/b option pour éviter d'ouvrir une nouvelle fenêtre de console (mais dans ce cas vous ne pouvez pas interrompre l'application en utilisant CTRL-C
Okay, merci. J'aurais dû lire attentivement chaque entrée de 'help' :) – RichN
J'ai effectivement eu des problèmes avec ça l'autre jour. J'ai dû lancer 30 fenêtres d'explorateur pour un test de performance. N'a pas fonctionné et ce n'était pas assez important pour moi de regarder dedans .. a commencé à naviguer autour de plutôt dans cette fenêtre et plusieurs heures plus tard quand je l'ai fermé, un autre a surgi! Et j'étais comme ce que diable, fermé ... un autre a surgi! Après 4-5 fenêtres et beaucoup de ce que le **** j'ai remarqué le batchfile toujours en cours d'exécution! –
Auto-publicité éhontée: Une fois, j'ai créé un lot qui est capable de fonctionner comme une sorte de pool de threads, juste pour les processus: http://stackoverflow.com/questions/672719/parallel-execution-of-shell-processes/676667 # 676667 – Joey