Affectation d'une variable dans une boucle (fichier de commandes) [dupliquer]

Oct 19 2020

Je résumerai mon problème global à une question très simple. Comment affecter une variable dans une boucle for dans un fichier batch?

Si j'utilise le fichier de commandes suivant dans Windows:

for %%f in (.\Update\!dos\*.zip) do (
    echo %%f
    set FileName3=%%f
    echo %FileName3%
    pause
)

Ce sera echola bonne valeur pour %%fmais ce echon'est rien pour%FileName3%

Je l'ai ensuite testé en attribuant directement FileName3une valeur directe comme test, qui a échoué.

Lors de la recherche de solutions, un pointeur courant consiste à utiliser SETLOCAL enabledelayedexpansion

Cependant, si j'ajoute cela en haut de mon fichier de commandes, il s'arrête simplement de fonctionner. Donc, même si je pense que cela fait probablement partie de la solution, sans la possibilité d'exécuter le fichier de commandes à tester, je ne peux pas déterminer.

Pour être clair, avec SETLOCAL enabledelayedexpansionen haut de mon fichier batch, si je double-clique sur le fichier rien ne se passe. Si je l'exécute à partir d'une ligne de commande, il revient simplement à l'invite comme si de rien n'était.

Ma question est donc la suivante: comment puis-je affecter une variable dans une boucle dans un fichier batch? Si la réponse est d'utiliser SETLOCAL enabledelayedexpansion, alors pourquoi l'ajouter à mon fichier de commandes ne le fait absolument rien.

Réponses

Compo Oct 20 2020 at 01:05

Dans votre cas, l'activation de l'expansion différée en haut de votre script ne fonctionnera pas. La raison en est qu'une partie de votre emplacement source comprend le !caractère, qui en raison d'une expansion retardée sera omis du nom, et votre script se terminera car le chemin .\Update\dos\n'existe pas.

L'astuce consiste à n'activer l'expansion différée que là où vous en avez besoin.

@Echo Off
SetLocal EnableExtensions DisableDelayedExpansion
If Not Exist "Update\!dos\*.zip" GoTo :EOF
For %%G In ("Update\!dos\*.zip") Do (
    Echo %%G
    Set "FileName3=%%G"
    SetLocal EnableDelayedExpansion
    Echo !FileName3!
    EndLocal
)
Pause

Ce que vous devez savoir cependant, c'est que n'importe laquelle de vos variables qui sont définies pendant les boucles SetLocaldeviendra indéfinie à la prochaine EndLocal. Cela signifie que si vous avez besoin de ces variables plus tard dans le code, vous devrez utiliser une méthode pour les passer au-dessus de la EndLocalbarrière. Cependant, cela est hors de la portée de votre exemple de code spécifique et n'a donc pas été inclus dans cet exemple.