對批處理文件處理來說,這是非常新穎的。我只是試圖執行下面的代碼,完全困惑。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
分析器將正確識別的操作和使用或不啓用延遲執行擴張預期的代碼。