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

Пакетные переменные Windows не будут установлены

Я думаю, что я столкнулся с ошибкой в ​​пакетном сценарии Windows.

Я не могу установить переменные, которые находятся в расширенном выражении if.

Вот изолированная часть моего script:

@echo off

set success=1
set Version=12345
set Target=Client
set Type=456
set dir=
set zip=

if "%Version%"=="" set success=0
if "%Type%"=="" set success=0

if 1==1 set test=42

if %success%==1 (
    set test2=57005
    if "%Target%"=="Client" (
        set dir=ModName v%Version%
        set zip=ModName v%Version% %Type%.zip
        echo Version: %Version%
        echo    Type: %Type%
        echo.
        echo  Target: %Target%
        echo     dir: %dir%
        echo     zip: %zip%
        echo.
        echo    test: %test%
        echo   test2: %test2%
    )
) else (
    echo Not successful.
)

Это результат нового экземпляра cmd:

C:\Users\RandomClown\Desktop>test.bat
Version: 12345
   Type: 456

 Target: Client
    dir:
    zip:

   test: 42
  test2:

Что вы должны заметить, так это то, что оператор single line if правильно задает материал. Многострочный if будет выполнять все, что НЕ является набором. Я не думаю, что что-то пропустил. Кроме того, многострочный оператор if правильно выполняет правильные строки, поскольку строки else ( echo Not successful. ) не выполняются.

Почему строки не выполнялись?

4b9b3361

Ответ 1

Вы что-то пропустили; -)

cmd расширяет переменные при анализе команд, а не при их запуске. Так получилось, что оператор if или for с блоком ( ... ) (или фактически любым блоком) объединяет одну команду в этом случае. Поэтому, когда вы устанавливаете переменные внутри блока и пытаетесь использовать их в одном блоке, больше нет переменных - они были заменены значениями, которые имели переменные до того, как блок даже был выполнен.

Прикрепите

setlocal enabledelayedexpansion

в начале вашего командного файла и используйте !zip! вместо %zip%. См. help set для подробного обсуждения проблемы.