web-dev-qa-db-fra.com

Batch Windows: appeler plus d'une commande dans une boucle FOR?

Est-il possible dans un fichier batch Windows d’appeler plus d’une commande dans une boucle niqueFOR? Disons par exemple que je veux imprimer le nom du fichier et après le supprimer:

@ECHO OFF
FOR /r %%X IN (*.txt) DO (ECHO %%X DEL %%X)
REM the line above is invalid syntax.

Je sais que dans ce cas, je pourrais le résoudre en effectuant deux boucles FOR distinctes: une pour afficher le nom et une pour supprimer le fichier, mais est-il possible de le faire en une seule boucle?

111
Marco Demaio
FOR /r %%X IN (*) DO (ECHO %%X & DEL %%X)
105
SilverSkin

En utilisant & convient pour les commandes courtes, mais cette ligne unique peut être très longue, très longue. Lorsque cela se produit, passez à la syntaxe multiligne.

FOR /r %%X IN (*.txt) DO (
    ECHO %%X
    DEL %%X
)

Placement de ( et ) _ importe. Les crochets après DO doivent être placés sur la même ligne, sinon le fichier de commandes sera incorrect.

Voir if /?|find /V "" pour plus de détails.

187
Anders

SilverSkin et Anders ont tous les deux raison. Vous pouvez utiliser des parenthèses pour exécuter plusieurs commandes. Cependant, vous devez vous assurer que les commandes elles-mêmes (et leurs paramètres) ne contiennent pas de parenthèses. cmd cherche avidement la première parenthèse fermante, au lieu de gérer les jeux de parenthèses imbriqués avec élégance. Cela peut entraîner l’échec de l’analyse du reste de la ligne de commande, ou le transfert de certaines parenthèses aux commandes (par exemple, DEL myfile.txt)).

Une solution de contournement consiste à diviser le corps de la boucle en une fonction distincte. Notez que vous devez probablement contourner le corps de la fonction pour éviter de "tomber à travers" dans celui-ci.

FOR /r %%X IN (*.txt) DO CALL :loopbody %%X
REM Don't "fall through" to :loopbody.
GOTO :EOF

:loopbody
ECHO %1
DEL %1
GOTO :EOF
30
bk1e