批量嵌套变量

时间:2015-06-24 07:08:32

标签: arrays windows batch-file

所以,我在Batch中有一些嵌套变量。

这给我带来了一个问题。

我有嵌套变量的原因是因为我通过以下方式模拟数组:

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

etc

现在,我有一个计数器counter

我希望能够%array[!counter!]%,输出等于!counter! + 1

但我不能。

我认为这是因为在%中包含它会让Windows尝试尽快扩展变量,而且会破坏计数器。

那么,为什么不做!array[!counter!]!呢?好吧,我试过这个,我认为,而不是将其解释为(array[(counter)]),其中()用于显示!!所持有的内容,Windows将其解释为(array[)counter(),这对我来说毫无用处。

请记住:每当我使用!!时,假设我已经完成了setlocal EnableDelayedExpansion - 我只是不包含它,因为这对我来说都是一种痛苦和读者。

任何想法如何解决这个问题?

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

这就是我最终做的事情:

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

最初,我通过变量counter使用手动计数器,但使用for /l意味着我可以拥有一个计数器,而不必将其设置为变量,更重要的是,不要将其称为!varname!;而是像%%varname一样,消除了混乱。