2016-02-11 2 views
1

Я пытаюсь использовать простой цикл для создания последовательности строк, за которой следует число. Однако, когда я пытаюсь добавить переменную итератора в конец строк, добавленное значение вместо этого является конечной точкой цикла.Почему эхо использует другое значение переменной цикла, чем установлено?

упрощенная версия сценария:

@echo off 

set STARTSTRING="Test- 

for /l %%x in (1, 1, 26) do (
    echo %%x 
    set CONCATENATED_STRING=%STARTSTRING%%%x" 
    echo %CONCATENATED_STRING% 
) 
pause 

Что дает выход:

enter image description here

Может кто-то пожалуйста, объясните мне, где я неправильно?

ответ

2

В пределах оператора блока (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 также гарантирует, что при завершении партии любые изменения, внесенные в переменные среды, будут отброшены. Если вы, как вы видели, переменная сохраняет свое значение, установленное в предыдущем пакетном запуске.

+0

С небольшим количеством попыток и сбоев это сработало отлично - я был немного удивлен тем, что мне не нужно было скрывать кавычки, которые мне нужны в строке внутри инструкции set! – eirikdaude

Смежные вопросы