2015-06-24 203 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