2017-01-03 82 views
1

我學習批處理腳本tutorialspoint現在,這裏是一個非常簡單的腳本:爲什麼在數組中使用set不能使用echo?

@echo off 

set a[0]=0 
set a[1]=1 
set a[2]=2 
set a[3]=3 
set a[4]=4 
set a[5]=5 

for /l %%n in (0,1,5) do (echo %a[%%n]%) 

爲什麼結果是"ECHO is off"

,如果我寫這樣for /l %%n in (0,1,5) do (echo a[%%n]) 我可以得到

a[0] 
a[1] 
a[2] 
a[3] 
a[4] 
a[5] 

所以爲什麼我不能使用echo來獲取數組的值?

+1

當命令處理程序發現一個塊(括號內的任何內容)時,將其完全解析並將變量擴展爲塊計算時的值。如果更新塊中的變量值,則需要爲變量啓用延遲擴展以反映所做的更改。使用'setlocal EnableDelayedExpansion'並將語法從'%var%'更改爲'!var!'來進行延遲擴展。 – elzooilogico

+1

關於[Windows命令解釋器(CMD.EXE)如何解析腳本有一個很好的解釋?](http://stackoverflow.com/questions/4094699/how-does-the-windows-command-interpreter-cmd-exe -parse-scripts/4095133#4095133) – elzooilogico

+0

給定鏈接的有趣網站。漂亮的演示文稿,大量的描述和代碼,但所有的例子都是錯誤的! 'set'命令中的等號前不能有空格。你可以在[這個答案]中查看批處理文件中陣列管理的詳細描述(http://stackoverflow.com/questions/10166386/arrays-linked-lists-and-other-data-structures-in-cmd-exe-批處理腳本/ 10167990#10167990)。 – Aacini

回答

1

正如你不應該在塊中使用百分比擴展(這裏是一個FOR塊),因爲百分比在塊被解析時被擴展。

改爲使用延遲擴展。

setlocal EnableDelayedExpansion 
for /l %%n in (0,1,5) do (echo !a[%%n]!) 
1

下面是一個可供選擇的方法,而不必使delayed expansion

for /l %%n in (0,1,5) do (call echo %%a[%%n]%%) 

環路call echo %%a[%%n]%%被解析,由於兩次call的主體;在第一次變爲call echo %a[0]%時,假設當前值%%n0,因爲%%變爲%,並且在第二次期間,%a[0]%被變量的相應值替換。


在你的方法,echo %a[%%n]%,在命令行解釋器看到兩個變量擴大,即%a[%%n]%,這都是不確定的,並因此成爲不受任何取代。

相關問題