Windows批处理文件数学怪异

Sir*_*eat 2 math for-loop batch-file

为什么这不起作用?

@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 "-----------------------------"
)
Run Code Online (Sandbox Code Playgroud)

这是我得到的输出:

1010
1010
1010
1010
1010
1010
1010
1010
1010
1010
1010
"----------------------------"
1010
1010
1010
1010
1010
1010
1010
1010
...
Run Code Online (Sandbox Code Playgroud)

它似乎在执行之前预先计算了数学,所以当它最终执行时,%curr%已经是1010.我如何防止它这样做?我试图获得这样的输出:

0
1
2
3
4
5
6
7
8
9
10
"----------------------------"
11
12
...
Run Code Online (Sandbox Code Playgroud)

提前致谢

JohannesRössel的回答(对于那些可能会在以后寻找它的人):

@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 "-----------------------------"
)
Run Code Online (Sandbox Code Playgroud)

Joe*_*oey 5

通过在循环之前放置以下行来使用延迟扩展:

setlocal enabledelayedexpansion enableextensions
Run Code Online (Sandbox Code Playgroud)

然后使用环境变量!curr!代替%curr%.

你改变一个环境变量的内容块内,并在同一个块再次使用更改的内容.没有延迟扩展,这是行不通的.原因是在解析命令时cmd扩展变量%foo%- 以及类似iffor包含可能跟随的块的命令.延迟扩展会导致在执行您想要的命令之前评估变量.

help set 包括对没有延迟扩展的问题的描述并使用它.