web-dev-qa-db-fra.com

lot de fenêtres SET à l'intérieur SI ne fonctionne pas

quand j'exécute ce script (à partir d'un fichier .bat):

set var1=true
if "%var1%"=="true" (
  set var2=myvalue
  echo %var2%
)

Je reçois toujours:

ECHO is on.

Signifiant le var2 La variable n'était pas vraiment définie. Quelqu'un peut-il m'aider à comprendre pourquoi?

81
Orad SA

var2 est défini, mais le développement dans la ligne echo %var2% se produit avant que le bloc ne soit exécuté.
En ce moment var2 est vide.

Par conséquent, la syntaxe delayExpansion existe, elle utilise ! au lieu de % et il est évalué au moment de l'exécution, pas au moment de l'analyse.

Veuillez noter que pour utiliser !, la déclaration supplémentaire setlocal EnableDelayedExpansion est nécessaire.

setlocal EnableDelayedExpansion
set var1=true
if "%var1%"=="true" (
  set var2=myvalue
  echo !var2!
)
148
jeb

Je suis un peu en retard pour la fête mais une autre façon de traiter cette condition est de continuer le processus en dehors de if, comme ceci

set var1=true
if "%var1%"=="true" (
    set var2=myvalue
)
echo %var2%

Ou/et utilisez la syntaxe goto

set var1=true
if "%var1%"=="true" (
    set var2=myvalue
    goto line10
) else (
    goto line20
)
. . . . .
:line10
echo %var2%
. . . . . 
:line20

De cette façon, l'expansion se produit "à temps" et vous n'avez pas besoin de setlocal EnableDelayedExpansion. En bout de ligne, si vous repensez la conception de votre script, vous pouvez le faire comme ça

5
T.S.