2

So, I have some nested variables in Batch.

It's causing me an issue.

The reason I have nested variables is because I am emulating an array via:

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

etc

Now, I have a counter counter

I want to be able to do %array[!counter!]%, and the output would equal !counter! + 1.

But I can't.

I think it's because having it surrounded in %'s makes Windows try to expand the variable ASAP, and it does, breaking the counter.

So, instead, why not do !array[!counter!]!? Well, I tried this, and I think that, instead of interpreting it as (array[(counter)]), where ()'s are used to show what !!'s are holding, Windows instead interprets it as (array[)counter(), which is useless to me.

Keep in mind: Whenever I use !!'s, assume I have done setlocal EnableDelayedExpansion -- I just don't include it as that would be a pain for both me and readers.

Any ideas how to fix this?

4
  • All array management details are expalined at Arrays, linked lists and other data structures in cmd.exe (batch) script Commented Jun 24, 2015 at 19:41
  • Yes, I understand this. This does not have to do with arrays, but instead with nested variables in general. Commented Jun 24, 2015 at 21:28
  • The problem is already solved, by the way, in case you were going to answer :] Commented Jun 24, 2015 at 21:30
  • 1
    If the problem is solved then you should inform this point to the community selecting one of the answers. I just wanted to note that the call echo %%array[!counter!]%% notation (that use counter variable as index) and the for /L %%i in (1,1,3) do echo !array[%%i]! method (that don't require the index variable) are both explained with detail at that link... Commented Jun 24, 2015 at 22:03

2 Answers 2

1

(at least) Two possible ways. The first is faster and more verbose - CALL command hits the performance.

@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
Sign up to request clarification or add additional context in comments.

1 Comment

Can you split this up in to two seperate methods?
0

This is what I ended up doing:

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

Originally, I was using a manual counter via variable counter, but using for /l means I can have a counter without having to set it to a variable, and, more importantly, not calling it like !varname!; instead like %%varname, eliminating confusion.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.