Пакетная индексация строк и отложенное расширение

Я разобрал свой проблемный код до проблемных строк. Почему первое эхо работает, а второе не работает?

setlocal enabledelayedexpansion
set /a r=19
set blocks=MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM

for /L %%a in (-%r%,1,%r%) do (
   set /a w2=r
   :: This works
   set line=!blocks:~0,%r%!
   echo( !line!

   ::This does'nt work
   set line=!blocks:~0,!w2!!   
   echo( !line!
)  
exit /b 

Отредактировано: я продолжал пытаться, и эта строка работает:

call set line=%%blocks:~0,!w2!%%

Теперь вопрос: кто-то может объяснить мне, ПОЧЕМУ я должен использовать вызов?

2 ответа

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

set line=!blocks:~0,%r%!

Или используйте вспомогательный цикл для других переменных.

 for /F "tokens=*" %%H in ("!w2!") do (
      set line=!blocks:~0,%%H!
   )

Возможные методы расширения переменной с помощью! Отложенное расширение! использование других переменных для позиции или длины подстроки, которые могут измениться внутри блока кода, описано в этом посте:

Чтобы получить значение подстроки, когда индекс изменяется внутри FOR/IF, заключите подстроку в символы с двойным процентом и перед командой вызовите. Например:

call set line=%%blocks:~0,!w2!%%

Этот метод хорошо использует тот факт, что call Команда позволяет повторно развернуть переменную, заключенную в двойные знаки процента, как описано во втором ответе на этот вопрос:

BatchLineParser:

1) Фаза: расширение %var%...

6) Фаза: если команда CALL, начните снова с фазы 1.

Другим способом достижения предыдущего процесса является использование дополнительной команды FOR для изменения отложенного расширения индекса эквивалентным заменяемым параметром, а затем использование отложенного расширения для подстроки. Этот метод работает быстрее, чем предыдущий CALL:

for %%w in (!w2!) do set line=!blocks:~0,%%w!
Другие вопросы по тегам