lote do windows SET dentro de IF não está funcionando

102

quando estou executando este script (de um arquivo .bat):

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

Eu sempre consigo:

ECHO is on.

Significa que a var2variável não foi realmente definida. Alguém pode me ajudar a entender por quê?

Orad SA
fonte

Respostas:

184

var2 é definido, mas a expansão na linha echo %var2%ocorre antes que o bloco seja executado.
Neste momento, var2está vazio.

Portanto, a sintaxe delayedExpansion existe, ela usa em !vez de %e é avaliada no tempo de execução, não no tempo de análise.

Observe que, para usar !, setlocal EnableDelayedExpansioné necessária a declaração adicional .

setlocal EnableDelayedExpansion
set var1=true
if "%var1%"=="true" (
  set var2=myvalue
  echo !var2!
)
Jeb
fonte
11
Obrigado, você acabou de me poupar de uma dor enorme.
Myna
Mesma regra para operadores &e &&. Este código é set x=some & set y=%x%thing & echo results %y%gerado %x%thing.
gwarah
13

Estou um pouco atrasado para a festa, mas outra forma de lidar com essa condição é continuar o processo fora if, assim

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

Ou / e use gotosintaxe

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

Desta forma a expansão ocorre "no tempo" e você não precisa setlocal EnableDelayedExpansion. Resumindo, se você repensar o design do seu script, você pode fazer assim

TS
fonte
Não consigo acessar uma variável que criei dentro de uma instrução if. Seu primeiro exemplo com var2 não funciona.
AntonioCS
@AntonioCS interessante ... este é exatamente o script que acabei de testar echo off set var1=true if "%var1%"=="true" ( set var2=myvalue ) echo %var2% pause.. e está funcionando. "se você criar uma variável no arquivo em lote, ela poderá ser acessada em qualquer lugar do programa." . aticleworld.com/batch-file-variables-and-scope
TS