Зачем был создан режим enabledelayedexpansion в batch-сценариях и для чего это необходимо?
Режим enabledelayedexpansion в командной строке cmd bat активируется для того, чтобы задержать развертывание переменных в циклах и блоках кода. Это позволяет использовать переменные, значение которых меняется в процессе выполнения сценария. В batch-сценариях режим enabledelayedexpansion был создан для управления переменными в циклах и блоках кода. Без него, переменные внутри циклов обычно разворачиваются один раз при входе в цикл, что может привести к ошибкам в случае изменения значения переменной внутри цикла. С помощью enabledelayedexpansion можно обеспечить поведение переменных заспекаться на момент выполнения, а не при входе в блок кода. Это делает код более гибким и позволяет избежать проблем с обработкой переменных в циклах.
Как я себе это понимаю:
cmd подставляют значения переменных до выполнения команды и формируют очередную командную строку, затем ее выполняют.
При этом команда for ... () со всем ее содержимым интерпретируется первоначально как одна команда (это можно увидеть если убрать echo off), соответственно переменные во внутренних командах цикла не могут быть подставлены в этот момент, т.к. они просто не имеют нужного значения в начале цикла.
Затем, когда выполняется цикл, запускается вложенный cmd и уже ему нужно подставлять переменные в команды.
Для того чтобы переменные не подставлялись перед выполнением цикла используется другой синтаксис обращения к переменным.
То же самое происходит и с if, видимо.