Пакетные переменные Windows не будут установлены - PullRequest
46 голосов
/ 13 марта 2012

Кажется, я столкнулся с ошибкой в ​​пакетном скриптинге Window.

Я не могу установить переменные в расширенном операторе if.

Вот отдельная часть моего сценария:

@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:

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

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

Ответы [ 2 ]

83 голосов
/ 13 марта 2012

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

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

Вставьте

setlocal enabledelayedexpansion

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

0 голосов
/ 11 января 2018

Напомню, что команда ms-dos "set" принимает каждую строку после знака равенства.Поэтому, если вы напишите

if "x"=="x" set a=foo else set a=bar
echo %a%  // output : foo else set a=bar

% a на самом деле установлен на «foo else set a = bar», а не на foo.Поэтому я всегда использую «()» для команды set, если в одной строке несколько команд.

if "%1"=="" (set a=20) else (set a=%1)    
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...