@Drovosek01

Зачем в cmd bat (командной строке) создали режим enabledelayedexpansion?

Изучаю возможности некоторой автоматизации нативными средствами в Windows.
Соответственно необходимо писать batch код в .cmd файлах.

В примерах наткнулся на получение контента переменной с помощью !var!, хотя обычно это %var%
Загулил для чего используются 2 восклицательных знака в bat cmd и один из ответов был:

... два восклицательных знака ! используются для указания, что переменная должна быть расширена в момент выполнения, а не при первом чтении строки, что делает их полезными в циклах и других блоках кода, где переменные могут изменяться.

С таким кодом
@echo off
setlocal enabledelayedexpansion
set var=initial
echo Before loop: !var!
for %%i in (1 2 3) do (
    set var=inside_loop_%%i
    echo Inside loop: !var!
)
echo After loop: !var!
endlocal


Вопрос:
Зачем вообще в batch-сценариях сделали режим enabledelayedexpansion?
То есть зачем сделали ограничение, что в циклах и условиях ранее объявленные переменные нельзя изменить в обычном режиме работы?
  • Вопрос задан
  • 144 просмотра
Решения вопроса 1
@res2001
Developer, ex-admin
Как я себе это понимаю:
cmd подставляют значения переменных до выполнения команды и формируют очередную командную строку, затем ее выполняют.
При этом команда for ... () со всем ее содержимым интерпретируется первоначально как одна команда (это можно увидеть если убрать echo off), соответственно переменные во внутренних командах цикла не могут быть подставлены в этот момент, т.к. они просто не имеют нужного значения в начале цикла.
Затем, когда выполняется цикл, запускается вложенный cmd и уже ему нужно подставлять переменные в команды.
Для того чтобы переменные не подставлялись перед выполнением цикла используется другой синтаксис обращения к переменным.

То же самое происходит и с if, видимо.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
@AUser0
Чем больше знаю, тем лучше понимаю, как мало знаю.
Сделали для изменения переменных в течении работы bat-скрипта. А что бы не потерять совместимость со старым алгоритмом, их сделали не %VAR%, а !VAR!. Кстати, после окончания работы скрипта в окружении остаются переменные, заданные внутри скрипта, и при следующем запуске скрипта они уже проинициализированы!

А пример в вопросе показывает изменение переменной прямо во время работы скрипта, на пальцах. Стандартные переменные %VAR% такого не могут.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы