批处理脚本如何创建具有特定连续数字的数组

batch script how to create an array with specific continued numbers

我需要创建一个整数数组,它在一个限制数字处停止,然后在另一个固定值之后继续。类似于 [1 2 3 4 5 10 11 12 13 14 15 16],其中 5 是限制数,10 是重新开始的地方。
你能做类似 set arr = [1:%lim%, 10:%max%] 的事情吗?

批处理没有 OR 运算符,因此您必须使用两个单独的 if 语句 - 一个用于第一组数字,一个用于第二组数字.但是,您可以将两者放在同一个 for 循环中:

@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[
@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确实没有数组,但是稍微想一下就可以模拟一个。

上述例程生成一个符合规范的值列表,准备好由 for 语句处理。

虽然可以使用 delayedexpansion,但可以避免使用该工具。通过 CALL ing a set 命令,命令在执行前被解析以解码象形文字,其中 %1 是变量名“var”

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

被处理为:

SET "var=%var% %v"

因为%%是转义的-%,%v会被元变量(loop-control变量)的值代替%%v

同样,

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

执行为

SET "var=%var:~1%"

删除第一个字符,即 space。

这个问题实际上是关于 几个 for /L 命令的,尽管它可以用嵌套的 if 命令或其他不同的方式来描述。 .

有几种不同的方法可以提供 for 命令的值,也可以实现它们。我认为这是最简单的:

@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%

请注意,此方法也适用于几个(两个以上)值范围。

PS - 此结果是 list,而不是 array