Использование ENABLEDELAYEDEXPANSION - PullRequest
2 голосов
/ 07 июля 2011

При использовании ENABLEDELAYEDEXPANSION в пакетном сценарии, существуют ли переменные, созданные в нем, после вызова ENDLOCAL?

1 Ответ

5 голосов
/ 07 июля 2011

Я понимаю, что ваш вопрос в основном касается команды SETLOCAL и ее эффектов, независимо от используемой опции (1001) * (100) *.

Мой краткий ответ: Нет , при условии, что переменные не существовали до входа в область действия SETLOCAL.

Мой более длинный ответ следующий:

Все изменения, внесенные в переменную в области действия SETLOCAL, отбрасываются при выходе из области действия (то есть при достижении ENDLOCAL). Это включает в себя:

  • определение ранее неопределенной переменной:

    @ECHO OFF
    
    <nul SET /P q=1.
    IF DEFINED ttt (ECHO defined) ELSE (ECHO undefined)
    
    SETLOCAL
    
    SET ttt=
    <nul SET /P q=2.
    IF DEFINED ttt (ECHO defined) ELSE (ECHO undefined)
    
    ENDLOCAL
    
    <nul SET /P q=3.
    IF DEFINED ttt (ECHO defined) ELSE (ECHO undefined)
    

    Это выводит:

    1.undefined
    2.defined
    3.undefined
    
  • отмена определения ранее определенной переменной:

    @ECHO OFF
    
    SET ttt=1
    <nul SET /P q=1.
    IF DEFINED ttt (ECHO defined) ELSE (ECHO undefined)
    
    SETLOCAL
    
    SET ttt=
    <nul SET /P q=2.
    IF DEFINED ttt (ECHO defined) ELSE (ECHO undefined)
    
    ENDLOCAL
    
    <nul SET /P q=3.
    IF DEFINED ttt (ECHO defined) ELSE (ECHO undefined)
    

    Вывод:

    1.defined
    2.undefined
    3.defined
    
  • изменение значения переменной:

    @ECHO OFF
    
    SET ttt=1
    ECHO 1.ttt=%ttt%
    
    SETLOCAL
    
    SET ttt=2
    ECHO 2.ttt=%ttt%
    
    ENDLOCAL
    
    ECHO 3.ttt=%ttt%
    

    И это дает следующий вывод:

    1.ttt=1
    2.ttt=2
    3.ttt=1
    

Как я сказал в начале, вышеизложенное относится к SETLOCAL независимо от того, используете ли вы его с дополнительными опциями или нет.

В заключение я хотел бы сказать, что можно сохранить результат, вычисленный в пределах SETLOCAL, для использования после ENDLOCAL. Вот небольшой трюк, который делает это возможным:

…
ENDLOCAL & SET var=%var%
…

Во время синтаксического анализа этой строки команда SETLOCAL все еще действует, поэтому %var% оценивается в значение, которое вы сохранили в var в последнее время. Когда строка выполняется , переменная var теряет свое значение сразу после ENDLOCAL, но команда SET уже содержит свое значение, только что подставленное, поэтому var получает его обратно, к всеобщему удовлетворению.

Согласно комментарию @Jeremy Murray, вы также можете получить доступ к измененному значению после ENDLOCAL, если вы включите ENDLOCAL и команду (команды) чтения переменной в одном блоке, заключенном в скобки:

…
(
ENDLOCAL
SET var=%var%
<i>anything else</i>
)
…

Эффект будет таким же, потому что команды в квадратных скобках и анализируются, и выполняются как одно целое: сначала они все анализируются, , а затем они все выполняются.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...