В пределах оператора блока (a parenthesised series of statements)
, блок всей анализируется и затем выполняются. Любой %var%
в блоке будет заменен значением этой переменной на момент анализа блока - до того, как блок будет выполнен - то же самое относится к FOR ... DO (block)
.
Следовательно, IF (something) else (somethingelse)
будет выполнен с использованием значений %variables%
в момент возникновения ошибки IF
.
Два распространенный способ преодоления этого является: 1) использовать setlocal enabledelayedexpansion
и использовать !var!
вместо %var%
, чтобы получить доступ к измененному значению var
или 2) для вызова подпрограммы, чтобы выполнить дальнейшую обработку с использованием измененных значений.
Так -
@echo off
setlocal enabledelayedexpansion
set "STARTSTRING=Test-"
for /l %%x in (1, 1, 26) do (
echo %%x
set "CONCATENATED_STRING=!STARTSTRING!%%x"
echo !CONCATENATED_STRING!
)
pause
Обратите внимание на расположение кавычек (. Так что паразитные пространства на концах линий не могут быть отнесены к переменной)
!var!
обращается значение во время выполнения из переменная в delayedexpansion
режиме - %var%
значение времени синтаксиса
setlocal
также гарантирует, что при завершении партии любые изменения, внесенные в переменные среды, будут отброшены. Если вы, как вы видели, переменная сохраняет свое значение, установленное в предыдущем пакетном запуске.
С небольшим количеством попыток и сбоев это сработало отлично - я был немного удивлен тем, что мне не нужно было скрывать кавычки, которые мне нужны в строке внутри инструкции set! – eirikdaude