Я видел SETLOCAL ENABLEDELAYEDEXPANSION и SETLOCAL DISABLEDELAYEDEXPANSION во многих пакетных файлах, но что делают на самом деле команды?
Включить и отключить Delayed Expansion, что он делает?
Ответ 1
enabledelayeexpansion инструктирует cmd распознавать синтаксис !var!, который обращается к значению current var. disabledelayedexpansion отключает этот объект, поэтому !var! становится просто тем, что в качестве строки.
В блочном выражении (a parenthesised series of statements) выполняется синтаксический анализ целого и , затем. Любой %var% внутри блока будет заменен значением переменной в момент анализа блока - до того, как будет выполнен блок - то же самое относится к FOR ... DO (block).
С помощью !var! вместо %var% открывается измененное значение var.
Ответ 2
Скопировано из Как вы используете SETLOCAL в пакетном файле? (как указал dbenham в своем первом комментарии).
Предположим, что этот код:
If "%getOption%" equ "yes" (
set /P option=Enter option:
echo Option read: %option%
)
Предыдущий код НЕ будет работать, потому что значение% option% заменяется только один раз, когда команда IF обрабатывается (до ее выполнения). Вам нужно "задержать" расширение переменной до тех пор, пока команда SET/P не изменит значение переменной:
setlocal EnableDelayedExpansion
If "%getOption%" equ "yes" (
set /P option=Enter option:
echo Option read: !option!
)
Проверьте это:
set var=Before
set var=After & echo Normal: %var% Delayed: !var!
Выход: Normal: Before Delayed: After