Подтвердить что ты не робот

Пакет окон SET внутри IF не работает

когда я запускаю этот script (из файла .bat):

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

Я всегда получаю:

ECHO is on.

Значение переменной var2 не было действительно задано. Может ли кто-нибудь помочь мне понять, почему?

4b9b3361

Ответ 1

переменная var2 установлена, но раскрытие в строке echo %var2% происходит до выполнения блока.
В это время var2 пуст.

Поэтому синтаксис delayedExpansion существует, он использует ! вместо % и оценивается во время выполнения, а не во время разбора.

Обратите внимание, что для того, чтобы использовать ! необходим дополнительный оператор setlocal EnableDelayedExpansion.

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

Ответ 2

Я немного опоздал на вечеринку, но другой способ справиться с этим условием - продолжить процесс на улице, if, как это

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

Или/и использовать синтаксис goto

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

Таким образом, расширение происходит "вовремя", и вам не нужен setlocal EnableDelayedExpansion. В итоге, если вы переосмыслите дизайн своего скрипта, вы можете сделать это так