Пакетная индексация строк и отложенное расширение
Я разобрал свой проблемный код до проблемных строк. Почему первое эхо работает, а второе не работает?
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!