Не может работать из-за порядка фаз синтаксического анализатора.
Пример выполнения для
set foo=xxx
set line=Content xxx # %%foo%% #
Первая фаза - это фаза расширения процента.
, которую вы использовалиэто в блоке скобок не меняет это поведение.
Таким образом, вы получаете
call echo !line:%foo%=bar!
Затем начинается выполнение блока, и если строка выполняется, следующая соответствующая фаза - этоВ фазе отложенного расширения %foo%
будет заменен не контент, поэтому вы получите
call echo Content xxx # bar #
Теперь вызов перезапускает анализатор с процентным расширением, но процентов больше нет.
Я полагаю, что содержимое foo
может измениться внутри вашего цикла FOR, поэтому вам нужно расширять его в любое время, а не только один раз при разборе блока.
И даже если вы избегаете восклицательных знаков, так что они включаются первыми после вызова, он не может работать, так как отложенное расширение не работает внутри выполнения вызова.
Но вы можете использовать это вместо этого, это работает, так как фаза расширения FOR-Variable находится непосредственно перед фазой отложенного расширения.
for ... do (
for /F "delims=" %%F in("!foo!") DO
echo !line:%%F=bar!
)
Некоторые объяснения фаз синтаксического анализа приведены на Как работает команда WindowsСценарии синтаксического анализа интерпретатора (CMD.EXE)?