2016-12-12 12 views
0

Я хотел бы напечатать следующее:Выполнение арифметических операций в цикле с переменными в пакетном

0 
1 
2 
3 
4 

Я попытался это:

ECHO OFF 
FOR /L %%A in (1,1,5) DO (
    SET /a "B=%%A-1" 
    ECHO %B% 
) 

Однако, это дает мне:

4 
4 
4 
4 
4 

Как я могу достичь желаемого выхода при использовании как A, так и B в моем коде?

+2

Это проблема с задержкой расширения. Слишком ленив, чтобы google это, но есть сотни вопросов, подобных этому на SO уже. Почему не просто 'for/L %% A в (0,1,4)'? Если это непрактично, тогда вы должны «setlocal enabledelayedexpansion» и «echo! B!». Для получения дополнительной информации «help set» в консоли cmd, обращая внимание на начало раздела «Наконец, добавлена ​​поддержка расширенного расширения переменных среды». – rojo

+0

Этот код не выводит ** 4 ** пять раз. Он будет выводить 'ECHO IS OFF' пять раз. – Squashman

+1

@Squashman Он выводит 'ECHO IS OFF' пять раз в первый раз, когда я его запускал, но в следующий раз я его запустил пять раз в следующий раз. – IslandPatrol

ответ

1
ECHO OFF 
setlocal 
FOR /L %%A in (1,1,5) DO (
    SET /a "B=%%A-1" 
    call ECHO %%B%% 
) 

Поскольку вы не используете setlocal, B будет установлен на значение от предыдущего запуска. %B% будет заменен на 4, так как B был установлен в 4 на предыдущий прогон. трюк call echo использует разбор синтаксического разбора для извлечения текущего (времени выполнения) значения переменной.

Вот «официальный» способ:

ECHO OFF 
setlocal enabledelayedexpansion 
FOR /L %%A in (1,1,5) DO (
    SET /a "B=%%A-1" 
    ECHO !B! 
) 

В режиме delayedexpansion, !var! извлекает значение var, как она меняется во время выполнения. Это не лишено недостатков, но вам нужно прочитать delayedexpansion для руководства по этому вопросу.