批处理脚本如何创建具有特定连续数字的数组
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
我需要创建一个整数数组,它在一个限制数字处停止,然后在另一个固定值之后继续。类似于 [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