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?
FOR /r %%X IN (*) DO (ECHO %%X & DEL %%X)
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.
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