【问题标题】:Windows Batch File Math WeirdnessWindows批处理文件数学怪异
【发布时间】:2010-07-07 11:21:16
【问题描述】:

为什么这不起作用?

@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
...

提前致谢

Johannes Rö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 "-----------------------------"
)

【问题讨论】:

  • k,在我的问题中解决了这个问题(在我的实际批处理文件中,/a 在那里正确)

标签: math batch-file for-loop


【解决方案1】:

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

setlocal enabledelayedexpansion enableextensions

然后使用环境变量为!curr!,而不是%curr%

您正在更改块内环境变量的内容并且在同一块中再次使用更改后的内容。如果没有延迟扩展,这是行不通的。原因是cmd 在解析命令时扩展了%foo% 之类的变量,而iffor 之类的命令也包括可能跟随的块。延迟扩展会导致在执行您想要的命令之前立即评估变量。

help set 包含对没有延迟扩展的问题的描述,并且可以使用它。

【讨论】:

  • 太棒了!效果很好!谢谢!这是其他任何人都在寻找它的代码:@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 "---------------------------- -")
猜你喜欢
  • 2012-12-13
  • 2011-07-17
  • 2010-11-29
  • 2014-11-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-28
相关资源
最近更新 更多