对批处理文件处理来说,这是非常新颖的。我只是试图执行下面的代码,完全困惑。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.可任何人都可以解释这背后的原因。
感谢
对批处理文件处理来说,这是非常新颖的。我只是试图执行下面的代码,完全困惑。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.可任何人都可以解释这背后的原因。
感谢
需要延迟扩展:http://www.robvanderwoude.com/variableexpansion.php
@echo off
setlocal enableDelayedExpansion
set m=100
set i=0
FOR /L %%N IN (;;0,1,%m%;;) do (
set /a i=1+!i!
)
endlocal & set /a i=%i%
echo %i%
在批处理文件,可变读取被替换为在分析时它们的值,执行线或封闭在块(代码之前插入语)。
所以,内部的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
分析器将正确识别的操作和使用或不启用延迟执行扩张预期的代码。