215 votes

Fonctionnant sous windows commandes fichier batch mode asynchrone

Dire, si j’ai

  • foo.exe
  • bar.exe
  • Baz.exe

Comment faire tous partir d’un fichier batch de manière asynchrone, c'est-à-dire sans attendre le blocage du programme précédent ?

287voto

macbirdie Points 9417

À l’aide de `` commande à exécuter chaque programme, vous devriez obtenir ce dont vous avez besoin.

Chaque invocation s’exécute la commande donnée dans son paramètre et retourne immédiatement, sauf s’il est exécuté avec un passer.

Cela vaut pour les applications de ligne de commande. Applications sans ligne de commande retournent immédiatement de toute façon, alors bien sûr, si vous voulez exécuter tout de façon asynchrone, utilisez `` .

76voto

djKianoosh Points 330

Alliant un couple de la réponse à la question précédente, vous pourriez essayer d' start /b cmd /c foo.exe.

Pour un exemple trivial, si vous voulez imprimer les versions de java/groovy/graal/gradle, vous pourriez 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 de Sysinternals), vous verrez quelques-enfant cmd.exe les processus de chaque avec un processus java (comme pour les commandes ci-dessus). La sortie d'impression à l'écran dans l'ordre de leur arrivée.

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

40voto

sproaticus Points 159

Vous pouvez utiliser la commande start pour frayer les processus d’arrière-plan sans lancer de nouvelles fenêtres :

``

Le nouveau processus ne sera pas interruptable avec CTRL-C ; vous pouvez le tuer qu’avec CTRL-ATTN (ou en fermant la fenêtre ou via le gestionnaire des tâches.)

26voto

Nikhil Points 978

Créez un fichier batch contenant les lignes suivantes :

La commande start exécute votre commande dans une nouvelle fenêtre, donc toutes les 3 commandes seraient exécutée de façon asynchrone.

11voto

schmod Points 184

Il y a une troisième (et peut-être même beaucoup plus facile). Si vous voulez faire tourner plusieurs instances d'un même programme, à l'aide d'une commande de style Unix, processeur comme Xargs ou GNU Parallèle peut en faire un processus relativement simple.

Il y a un win32 Xargs clone appelé PPX2 qui rend ce assez simple.

Par exemple, si vous souhaitez 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"

La cueillette en dehors de cela, dir /b *.mpg s'empare d'une liste de .mpg fichiers dans mon répertoire courant, l' | opérateur de tuyaux de cette liste en ppx2, qui établit alors une série de commandes qui doivent être exécutées en parallèle; 4 à la fois, comme indiqué ici par l' -P 4 de l'opérateur. L' -L 1 opérateur indique ppx2 de n'envoyer qu'une seule ligne de notre inscription à l'annuaire pour ffmpeg à la fois.

Après cela, il vous suffit d'écrire votre ligne de commande (ffmpeg.exe -i "{}" -quality:v 1 "{}.mp4"), et {} est automatiquement remplacé pour chaque ligne de votre liste de répertoires.

Il n'est pas universellement applicable à tous les cas, mais est beaucoup plus facile que d'utiliser le fichier de commandes des solutions de contournement décrite ci-dessus. Bien sûr, si vous n'êtes pas affaire avec une liste de fichiers, vous pouvez aussi diriger le contenu d'un fichier texte ou tout autre programme dans l'entrée de pxx2.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X