Windows batch SET à l'intérieur IF ne fonctionne pas

102

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

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

J'ai toujours:

ECHO is on.

Cela signifie que la var2variable n'était pas vraiment définie. Quelqu'un peut-il m'aider à comprendre pourquoi?

Orad SA
la source

Réponses:

184

var2 est défini, mais l'expansion de la ligne echo %var2%se produit avant l'exécution du bloc.
A ce moment var2est vide.

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

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

setlocal EnableDelayedExpansion
set var1=true
if "%var1%"=="true" (
  set var2=myvalue
  echo !var2!
)
jeb
la source
11
Merci, vous venez de m'épargner une énorme douleur.
Myna
Même règle pour &et &&opérateurs. Ce code set x=some & set y=%x%thing & echo results %y%sort %x%thing.
gwarah
13

Je suis un peu en retard à la fête mais une autre façon de gérer cette condition est de continuer le processus à l'extérieur if, comme celui-ci

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

Ou / et utilisez la gotosyntaxe

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 «dans le temps» et vous n'en avez pas besoin setlocal EnableDelayedExpansion. En bout de ligne, si vous repensez la conception de votre script, vous pouvez le faire comme ça

TS
la source
Je ne parviens pas à accéder à une variable que j'ai créée dans une instruction if. Votre premier exemple avec var2 ne fonctionne pas.
AntonioCS
@AntonioCS intéressant ... c'est le script exact que je viens de tester echo off set var1=true if "%var1%"=="true" ( set var2=myvalue ) echo %var2% pause.. et ça marche. "si vous créez une variable dans le fichier de commandes à laquelle il est possible d'accéder n'importe où dans le programme." . aticleworld.com/batch-file-variables-and-scope
TS