所以,我在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
- 我只是不包含它,因为这对我来说都是一种痛苦和读者。
任何想法如何解决这个问题?
答案 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
一样,消除了混乱。