zestaw wsadowy systemu Windows wewnątrz, jeśli nie działa

102

kiedy uruchamiam ten skrypt (z pliku .bat):

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

Zawsze dostaję:

ECHO is on.

Oznacza to, że var2zmienna nie została tak naprawdę ustawiona. Czy ktoś może mi pomóc zrozumieć, dlaczego?

Orad SA
źródło

Odpowiedzi:

184

var2 jest ustawione, ale rozwinięcie w linii echo %var2%następuje przed wykonaniem bloku.
W tej chwili var2jest pusty.

Dlatego istnieje składnia delayedExpansion, która używa !zamiast %niej i jest oceniana w czasie wykonywania, a nie w czasie analizy.

Należy pamiętać, że aby skorzystać !, setlocal EnableDelayedExpansionpotrzebne jest dodatkowe oświadczenie .

setlocal EnableDelayedExpansion
set var1=true
if "%var1%"=="true" (
  set var2=myvalue
  echo !var2!
)
jeb
źródło
11
Dzięki, oszczędziłeś mi ogromnego bólu.
Myna
Ta sama zasada dla operatorów &i &&. Ten kod set x=some & set y=%x%thing & echo results %y%wyprowadza %x%thing.
gwarah
13

Trochę spóźniłem się na imprezę, ale innym sposobem radzenia sobie z tym stanem jest kontynuowanie procesu na zewnątrz if, w ten sposób

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

Lub / i użyj gotoskładni

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

W ten sposób ekspansja następuje „w czasie” i nie jest to potrzebne setlocal EnableDelayedExpansion. Podsumowując, jeśli przemyślisz projekt swojego skryptu, możesz to zrobić w ten sposób

TS
źródło
Nie mogę uzyskać dostępu do zmiennej, którą utworzyłem w instrukcji if. Twój pierwszy przykład z var2 nie działa.
AntonioCS
@AntonioCS interesujący ... to jest dokładnie skrypt, który właśnie przetestowałem echo off set var1=true if "%var1%"=="true" ( set var2=myvalue ) echo %var2% pause... i działa. „jeśli utworzysz zmienną w pliku wsadowym, do której będzie można uzyskać dostęp w dowolnym miejscu programu”. . aticleworld.com/batch-file-variables-and-scope
TS