Vous tombez dans l'ancien piège de ne pas utiliser l'expansion retardée.
Pour une solution rapide, il suffit de mettre
setlocal enabledelayedexpansion
avant cette boucle dans votre fichier batch et utiliser !name!
au lieu de %name%
.
CMD développe des variables lors de l'analyse d'une commande. Une commande dans ce sens est une ligne unique ou un "bloc", délimité par des parenthèses. La boucle complète for
est seulement analysée une fois et à ce stade %name%
est remplacée par la valeur qu'elle a à ce moment-là, à savoir "dummy"
. D'autre part, l'expansion retardée utilise !
au lieu de %
pour délimiter les noms de variables et les variables sont alors développées juste avant l'exécution d'une commande.
Chaque fois que vous définissez une variable dans un bloc entre parenthèses et utilisez à nouveau sa valeur dans le même bloc, vous devez utiliser l'expansion retardée. help set
a également quelques informations à ce sujet:
environnement Delayed expansion des variables est utile pour contourner les limites de l'expansion actuelle qui se produit quand une ligne de texte est lecture, pas quand il est exécuté. Le exemple suivant illustre le problème avec l'extension de variable immédiate:
set VAR=before
if "%VAR%" == "before" (
set VAR=after
if "%VAR%" == "after" @echo If you see this, it worked
)
ne serait jamais afficher le message, depuis les %VAR%
dans les deuxIF
déclarations est substitué lorsque la première IF
déclaration est lu, puisque Logiquement, le inclut le corps du IF
, qui est une instruction composée. Donc le IF
à l'intérieur de l'instruction composée est en comparant réellement "avant" avec "après" qui ne sera jamais égal.De même, l'exemple suivant ne fonctionne pas comme prévu:
set LIST=
for %i in (*) do set LIST=%LIST% %i
echo %LIST%
en ce qu'il pas construire une liste des fichiers dans le répertoire courant, mais à la place sera juste la variable LIST
à le dernier fichier trouvé. Encore une fois, cela est parce que le %LIST%
est juste une fois étendu lorsque l'instruction FOR
est lu, et à ce moment- la variable LIST
est vide. Ainsi, la boucle réelle FOR
nous exécutons est:
for %i in (*) do set LIST= %i
qui ne cesse mise LIST
au dernier fichier trouvé.
environnement Delayed expansion des variables vous permet d'utiliser un caractère différent (le point d'exclamation) à développer des variables d'environnement à temps d'exécution. Si la variable retardée d'expansion est activée, les exemples ci-dessus pourraient être écrits comme suit au travail comme prévu:
set VAR=before
if "%VAR%" == "before" (
set VAR=after
if "!VAR!" == "after" @echo If you see this, it worked
)
set LIST=
for %i in (*) do set LIST=!LIST! %i
echo %LIST%
Merci beaucoup! Vous avez définitivement sauvé ma journée. fabio vitale –