2010-07-07 116 views
2

爲什麼不能正常工作?Windows批處理文件數學奇怪

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

感謝

從約翰內斯羅塞爾回答(對於那些誰可能會尋找它以後):

@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 "-----------------------------" 
) 
+0

k,修正了在我的問題中(在我的實際批處理文件中,我有正確的'/ a') – 2010-07-07 11:33:57

回答

5

使用延遲擴展由在您的循環之前放置以下行:

setlocal enabledelayedexpansion enableextensions 

然後使用環境變量a s !curr!而不是%curr%

您正在更改塊內環境變量的內容在同一個塊中再次使用更改的內容。這不能沒有延遲擴展。原因在於cmd在解析命令時擴展了像%foo%這樣的變量 - 而像iffor這樣的命令也包含了可能跟隨的塊。延遲擴展會導致在執行命令之前對變量進行評估,這正是您想要的。

help set包括描述什麼出現問題而沒有延遲擴展並且適用於它。

+0

太棒了!很棒!謝謝!下面是與變化爲別人尋找它的代碼: 關閉@echo SETLOCAL enabledelayedexpansion ENABLEEXTENSIONS 用於/ L %%我在(0,1,100)做( 在/ L %%Ĵ(0 ,1,10)do( set/a curr = %% i * 10 + %% j echo!curr! ) echo「------------------ -----------「 ) – 2010-07-07 11:30:32

+0

grrr ...我會將它添加到我的原始文章,以保持良好的格式... – 2010-07-07 11:30:58