2015-06-24 200 views
2

所以,我在批處理中有一些嵌套變量。批處理嵌套變量

這是我的問題。

我有嵌套變量的原因是因爲我是通過模仿的數組:

array[0]=1 
array[1]=2 
array[2]=3 

etc 

現在,我有一個計數器counter

我希望能夠做%array[!counter!]%,並且輸出將等於!counter! + 1

但我不能。

我想這是因爲有它在%包圍的使Windows嘗試儘快擴大變量,它打破了櫃檯。

所以,相反,爲什麼不這樣做!array[!counter!]!?嗯,我想這一點,我認爲,而不是將其解釋爲(array[(counter)]),其中()的是用來展示一下!!的持有,窗口,而不將其解釋爲(array[)counter(),這對我沒用。

請記住:每當我使用!!的時候,假設我已經完成了setlocal EnableDelayedExpansion - 我只是不包含它,因爲這對我和讀者都是一種痛苦。

任何想法如何解決這一問題?

+0

所有陣列管理的細節在[數組,鏈表和其他數據結構中的cmd.exe(批處理)腳本(http://stackoverflow.com/questions/10166386/arrays-linked-lists-and-other expalined -data-structures-in-cmd-exe-batch-script/10167990#10167990) – Aacini

+0

是的,我明白這一點。這不需要處理數組,而是通常使用嵌套變量。 – Quelklef

+0

問題已經解決了,順便說一句,如果你打算回答:] – Quelklef

回答

0

這是我落得這樣做:

for /l %%a in (1;1;3) do (
    echo !array[%%a]! 
) 

本來,我是用通過可變counter手動計數,但使用for /l意味着我可以有一個計數器,而無需將其設置爲可變的,更重要的是,不會像!varname!那樣叫它;而不是像%%varname,消除混淆。

1

(至少)兩種可能的方式。第一個更快,更詳細 - CALL命令擊中表現。

@echo off 
setlocal enableDelayedExpansion 
set array[0]=1 
set array[1]=2 
set array[2]=3 

set counter=0 
echo first way : 
for /l %%# in (1;1;3) do (
    for /f %%$ in ("!counter!") do echo !array[%%$]! 


    set /a counter=counter+1 

) 
set counter=0 
echo second way : 
for /l %%# in (1;1;3) do (

    call :subr1 !counter! 

    set /a counter=counter+1 

) 
goto :eof 

:subr1 
    echo !array[%1]! 
goto :eof 
+0

你可以將它分成兩個獨立的方法嗎? – Quelklef

+0

@PieCrust - 完成 – npocmaka