2013-11-14 14 views
0

我試圖在for循環中使用索引並將其存儲在變量中。 我寫一個批處理文件與此代碼:在批處理路徑中使用索引

FOR /L %%x IN (1,1,3) DO (
    ECHO %%x 
    SET tmp=prefix_%%x.suffix 
    ECHO tmp is %tmp% 
) 

運行它時,我得到:

1 
tmp is prefix_3.suffix 
2 
tmp is prefix_3.suffix 
3 
tmp is prefix_3.suffix 

我希望它是:

1 
tmp is prefix_1.suffix 
2 
tmp is prefix_2.suffix 
3 
tmp is prefix_3.suffix 

我在做什麼錯?!

回答

4
Setlocal enableextensions enabledelayedexpansion 

FOR /L %%x IN (1,1,3) DO (
    ECHO %%x 
    SET tmp=prefix_%%x.suffix 
    ECHO tmp is !tmp! 
) 

for命令中的所有塊在獲得時都會被評估。由於%% x變化是已知在循環期間更改的特殊變量,因此只會翻譯一次,並且不會重新評估。啓用延遲擴展並將sintax更改爲!tmp!將指示cmd在每次訪問時重新評估該變量。

+0

哇,這是我的第一個關於堆棧溢出的問題,只是一個完美的答案。謝謝你:-) – RLaaa

+1

危險,威爾羅賓遜一刻! 'TMP'應該設置爲與'TEMP'相同,並且應該指向一個目錄來存儲臨時文件。一些較舊的軟件可能會做出這樣的假設,如果您改變了它,軟件可能會不可預測地發生作用(一些預定義的變量之一,最好不要改變 - 對於不完整的列表,請在提示符處輸入SET ...) ,響應'prefix_3'是變量建立之前的先前運行的宿醉。因此,通常使用'setlocal'作爲批處理的第一個命令 - 這可以確保在批處理結束時批處理所做的更改將被退出。 – Magoo

相關問題