2009-09-19 7 views

Répondre

206

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.

+0

Okay, merci. J'aurais dû lire attentivement chaque entrée de 'help' :) – RichN

+7

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! –

+2

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

21

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.

26

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

+0

Upvote pour '' CTRL-BREAK''. –

+1

Où est "BREAK" sur les claviers ces jours-ci? – user2023370

+0

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

56

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 
+0

Pourquoi le signe @ avant le début commande? – Leonel

+7

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

9

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.

+1

Le dernier port xargs win32 fonctionne bien de nos jours (celui inclus avec git pour Windows de toute façon). –

+0

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

+0

@ 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

12

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

Questions connexes