2014-09-29 73 views
-4
echo off 
set apk[0]=apk 
for /r %%a in (.apk) do call array.bat add apk %%a 
call array.bat len apk length 
echo apk files found = %length% 
for /l %%G in (1,1,%length%) do (
call array.bat getitem apk %%G item 
echo %item% 
) 
echo Pick one: 
set /p pick= 
call array.bat getitem apk %pick% chose 
echo. 
echo You picked %chose%. 
pause 

在上面的代碼中,我將apk數組的長度設置爲9,但for循環打印ECHO的次數是10次? 我可以訪問數組o_O中的單個元素,並在用戶選擇正確顯示的選項後也可以訪問該代碼。我究竟做錯了什麼?CMD程序「for」循環錯誤

回答

3

作爲一個非常速戰速決,儘量

call echo %%item%% 

這是delayedexpansion一代7,863。這個主題有數百個SO條目。在塊語句(a parenthesised series of statements)內,整個塊被解析並且執行然後。該塊內的任何%var%將在該塊被解析時由該變量的值取代 - 在塊執行之前 - 同樣的事情適用於FOR ... DO (block)

因此,在遇到IF時,將使用%variables%的值執行IF (something) else (somethingelse)。克服這個

兩種常用方法是:1)使用setlocal enabledelayedexpansion並使用!var!代替%var%訪問的var改變的值或2),以調用一個子程序使用改變的值來執行進一步的處理。

因此請注意使用CALL ECHO %%var%%,它顯示var的更改值。 CALL ECHO %%errorlevel%%顯示,但遺憾的是,然後RESETS錯誤級別。

還請注意,使用原始代碼顯示的項目是上一個項目在之前運行中設置的項目。您的批處理中沒有setlocal命令,因此環境更改會永久建立,而不會在每批結束時退出。其結果是你在受污染的環境中運行。

+0

setLocal Enabled解決了我沒有真正理解的問題。<但我會谷歌它 – Rico 2014-09-29 23:43:47

+0

請參閱http://stackoverflow.com/a/18464353的解釋 – 2015-05-21 09:32:50