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?

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!
)

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


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
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.