2014-01-17 108 views
2

对批处理文件处理来说,这是非常新颖的。我只是试图执行下面的代码,完全困惑。Windows批处理文件处理 - 循环

@echo off 
set m=100 
set i=0 
FOR /L %%N IN (0,1,%m%)do (
set /a i=1+%i% 
) 

回波%I% 暂停

在这里,正在增加i的值,直到N达到100所以,我在循环结束时期待i的值是101,但它显示1.可任何人都可以解释这背后的原因。

感谢

回答

2

在批处理文件,可变读取被替换为在分析时它们的值,执行线或封闭在块(代码之前插入语)。

所以,内部的for循环置换成变量的前for循环的值%I%的参考,即,0和%M%被替换为100,和什么被执行是

for /l %%n in (0 1 100) do (set /a i=1+0) 

您可以启用延迟扩展(setlocal enabledelayedexpansion命令)并将sintax从%i%更改为!i!以指示读取到变量的解析器应延迟到执行该行的时刻。代码应该是

@echo off 
    setlocal enabledelayedexpansion 
    set m=100 
    set i=0 
    FOR /L %%N IN (0,1,%m%)do (
    set /a i=1+!i! 
) 
    echo %i% 
    endlocal 

在for循环中读取i的值被延迟。这样一来,每次执行该行之前都会获得真实的价值。参考i在循环外不需要它。当到达并解析该行时,检索并回显正确的值。

无论如何,虽然这是一般规则,但set /a有不同的行为。如果你改变你的代码

set /a i+=1 

set /a i=i+1 

分析器将正确识别的操作和使用或不启用延迟执行扩张预期的代码。