2014-01-17 216 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 

分析器將正確識別的操作和使用或不啓用延遲執行擴張預期的代碼。