alfred
alfred

Reputation: 123

batch script how to create an array with specific continued numbers

I need to create an integer array that stops at a limit number and then goes on after another fixed value. Something like [1 2 3 4 5 10 11 12 13 14 15 16], where 5 is the limit number and 10 where it restarts.
Can you do something like set arr = [1:%lim%, 10:%max%] ?

Upvotes: 0

Views: 901

Answers (3)

Magoo
Magoo

Reputation: 80013

@ECHO OFF
SETLOCAL

CALL :buildlist mylist 1 5 10 16

ECHO list is %mylist%

PAUSE

GOTO :eof

:: Produce a list of integers
:: %1 is listname
:: %2 is start value
:: %3 is end-value for range
:: %4 is restart-value
:: %5 is end-value

:buildlist
SET "%1="
FOR /L %%v IN (%2,1,%5) DO (
 IF %%v leq %3 CALL SET "%1=%%%1%% %%v" 
 IF %%v geq %4 CALL SET "%1=%%%1%% %%v"
)

CALL SET "%1=%%%1:~1%%"

GOTO :eof

Batch really doesn't have arrays, but can simulate one with a little imagination.

The above routine produces a list of values to the specification, ready for processing by a for statement.

Although it's possible to use delayedexpansion, it's possible to avoid that facility. By CALL ing a set command, the command is parsed before execution so to decode the hieroglyphics, where %1 is the variable name "var"

SET "%1=%%%1%% %%v"

is processed as:

SET "var=%var% %v"

as %% is an escaped-%, and %v will be replaced by the value of the metavariable (loop-control variable) %%v

Similarly,

SET "%1=%%%1:~1%%"

is executed as

SET "var=%var:~1%"

which deletes the first character, which will be a space.

Upvotes: 2

Aacini
Aacini

Reputation: 67216

This problem is about several for /L commands really, although it could be described in terms of nested if commands or in other different ways...

There are several different methods to give the values of the for commands, and also to implement they. I think this is the simplest one:

@echo off
setlocal EnableDelayedExpansion

set ranges="1:5" "10:16"

set "list="
for %%a in (%ranges::= 1 %) do for /L %%i in (%%~a) do set "list=!list! %%i"

echo list=%list%

Note that this method also works with several (more than two) ranges of values.

PS - This result is a list, not an array

Upvotes: 2

SomethingDark
SomethingDark

Reputation: 14305

Batch doesn't have OR operators, so you'll have to make do with two separate if statements - one for the first set of numbers and one for the second set of numbers. You can, however, put both of those in the same for loop:

@echo off
setlocal enabledelayedexpansion

set "lim=5"
set "max=10"

REM Setting counter to -1 because we're going to increment the counter and then
REM use it, and arrays famously start at zero.
set "counter=-1"
for /L %%A in (1,1,16) do (
    if %%A LEQ %lim% (
        set /a counter+=1
        set "array[!counter!]=%%A"
    )
    if %%A GEQ %max% (
        set /a counter+=1
        set "array[!counter!]=%%A"
    )
)

REM Display the contents of the array just to prove it worked.
REM Alphabetic order is used, so array[10] and array[11] are going to print before array[1]
set array[

Upvotes: 1

Related Questions