Пакетный файл Windows Math Weirdness - PullRequest
2 голосов
/ 07 июля 2010

Почему это не работает?

@echo off

for /l %%i in (0, 1, 100) do (
    for /l %%j in (0, 1, 10) do (
        set /a curr=%%i*10 + %%j
        echo %curr%
    )
    echo "-----------------------------"
)

Это вывод, который я получаю из этого:

1010
1010
1010
1010
1010
1010
1010
1010
1010
1010
1010
"----------------------------"
1010
1010
1010
1010
1010
1010
1010
1010
...

Кажется, что он выполняет предварительные вычисления перед выполнением, так что когдаон, наконец, выполняется, %curr% уже на 1010. Как мне удержать его от этого?Я пытаюсь получить вывод, подобный этому:

0
1
2
3
4
5
6
7
8
9
10
"----------------------------"
11
12
...

Заранее спасибо

Ответ от Йоханнеса Ресселя (для тех, кто может искать его позже):

@echo off
setlocal enabledelayedexpansion enableextensions

for /l %%i in (0, 1, 100) do (
    for /l %%j in (0, 1, 10) do (
        set /a curr=%%i*10+%%j
        echo !curr!
    )
    echo "-----------------------------"
)

1 Ответ

5 голосов
/ 07 июля 2010

Используйте отложенное расширение, поместив следующую строку перед вашими циклами:

setlocal enabledelayedexpansion enableextensions

И затем используйте переменную среды как !curr! вместо %curr%.

Вы меняетесодержимое переменной среды внутри блока и снова использует измененное содержимое в том же блоке.Это не может работать без отложенного расширения.Причина в том, что cmd расширяет переменные, такие как %foo%, при синтаксическом анализе команды, а команда, такая как if или for, включает в себя блок, который также может следовать.Отложенное расширение приводит к тому, что переменные оцениваются непосредственно перед выполнением команды, которая здесь вам нужна.

help set включает в себя описание того, что происходит неправильно без отложенного расширения, и работает с ним.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...