6 votes

Comment ouvrir une nouvelle fenêtre cmd et exécuter une boucle for dedans?

J'ai un fichier test.cmd avec la commande suivante :

call "cmd /c start echo foo && pause"
call "cmd /c start for /l %%x in (0, 1, 2) do python test.py config%%x"

La première commande fonctionne bien et montre que l'approche générale devrait fonctionner. La deuxième avec la boucle for me pose problème.

Quand j'exécute cette commande directement dans une fenêtre CMD (avec seulement un signe % avant l'itérateur), mon script python "test.py" démarre dans une nouvelle fenêtre CMD 3 fois en boucle comme prévu.

Quand j'exécute la même commande depuis mon test.cmd (cette fois avec deux % bien sûr), la nouvelle fenêtre CMD apparaît brièvement puis disparaît immédiatement. Je ne reçois aucun message d'erreur et je n'arrive pas à ce que la nouvelle fenêtre reste ouverte.

Je soupçonne que j'ai besoin de faire un peu plus d'encodage mais je n'arrive pas à trouver la syntaxe correcte. Que dois-je changer pour que cette boucle for s'exécute depuis mon test.cmd ?

5voto

Stephan Points 6585

Si vous insistez pour utiliser call, il y a un autre niveau d'analyse, donc dans un fichier batch vous devez utiliser :

call "cmd /k start for /l %%%%i in (1,1,10) do echo %%%%i"

(remplacez /c par /k pour voir la sortie)

2voto

npocmaka Points 7794

Essayez ceci :

call "cmd /c for /l %x in (0, 1, 2) do @python test.py config%x"

lorsque vous exécutez des boucles dans l'invite de commandes, vous avez besoin d'un seul symbole de pourcentage. Et vous devez supprimer la commande de démarrage après le cmd /c parce que for est une commande cmd interne. Le @ est pour supprimer l'impression de la valeur de l'invite à chaque itération.

1voto

aschipfl Points 17476

Cette réponse élaborer sur la question principale énoncée dans le titre de votre publication plutôt que sur le code d'exemple que vous avez fourni.


Pour exécuter une boucle for dans une fenêtre séparée (cmd), la commande start est nécessaire. De plus, une instance explicite de cmd doit être donnée afin d'éviter des problèmes avec start lors de l'appel de lignes de commande internes (par exemple, les parenthèses peuvent provoquer des erreurs), et aussi pour avoir le contrôle sur ce qu'il se passe avec la nouvelle fenêtre une fois la boucle terminée.

La commande suivante exécute une boucle for dans une nouvelle fenêtre cmd, qui reste ouverte une fois la boucle terminée (très utile pour le débogage):

start "" /WAIT cmd /K "for /L %%X in (0,1,2) do echo %%X"

Tapez exitdans la nouvelle fenêtre pour la fermer. Pour fermer automatiquement la nouvelle fenêtre à la fin, remplacez /K par /C.

Si vous ne voulez pas que votre script batch principal (appelant) attende la fin de la boucle et la fermeture de la nouvelle fenêtre, supprimez le commutateur /WAIT. De cette façon, la ligne de commande est démarrée, mais le script principal continue immédiatement son exécution. Cela vous permet d'exécuter plusieurs boucles for dans des fenêtres séparées simultanément.


Cette technique n'est pas limitée à l'appel de boucles for uniquement.

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