我有一个批处理脚本,它收集数据并将其插入名为输出的数组 cnt ,声明为set "output[!cnt!]=%%a"
我有一个循环for /L %%n in (1 3 !cnt!) DO echo !output[%%n]!
的迭代器
这将回应
第1,第4,第7,第10元素等等......
如何修改功能以回显以下序列
第1,第2,第4,第5,第7,第8,第10,第11元素等等......
我正在寻找DO echo !output[%%n]! !output[%%n+1]!
行的内容,但我没有正确的语法。
任何其他解决方案也可以。
这就是我在C编程中的表现
for(n=1;i<cnt;n+=3){printf("%d %d",output[n],output[n+1])}
逐步如下:
最初n = 1显示输出[1]输出[2]
一次迭代后n = 4显示输出[4]输出[5]
再经过一次迭代后,n = 7显示输出[7]输出[8]
我的别有用心是获得通用语法,我们可以在其中显示(n + m)th 元素
for(n=1;n<cnt;n+=3){printf("%d %d",output[n],output[n+m])}
解决方案不需要包含for循环,执行也可以。
答案 0 :(得分:4)
0003
您要做的是打印每个不是3的倍数的元素。最简单的方法是使用modulo operation。
<强>伪码强>:
1st,2nd,4th,5th,7th,8th,10th,11th element and so on....
使用if %%n modulo 3 >= 1 then print something.
的批处理文件算术中的模数运算符为set /a
。
示例批处理文件(test.cmd):
%%
<强>输出强>:
@echo off
setlocal enabledelayedexpansion
for /l %%n in (1 1 20) do (
rem print values where cnt is not a multiple of 3
set /a _mod=%%n %% 3
if [!_mod!] GEQ [1] (
echo %%n
)
)
endlocal
您可以在批处理文件中使用相同的技术。
<强>段强>:
F:\test>test
1
2
4
5
7
8
10
11
13
14
16
17
19
20
这就是我在C编程中所做的工作
@echo off
setlocal enabledelayedexpansion
rem collect data and insert into array
rem ...
rem print values where cnt is not a multiple of 3
for /l %%n in (1 1 !cnt!) do (
set /a _mod=%%n %% 3
if [!_mod!] GEQ [1] (
echo !output[%%n]!
)
)
endlocal
示例批处理文件(test.cmd):
for(n=1;i<cnt;n+=3){printf("%d %d",output[n],output[n+1])}
注意:
用法:
@echo off
setlocal enabledelayedexpansion
for /l %%n in (%1 3 20) do (
set /a _next=%%n+1
echo %%n !_next!
)
)
endlocal
但我在评论中说我要输出
F:\test>test 1 1 2 4 5 7 8 10 11 13 14 16 17 19 20 F:\test>test 2 2 3 5 6 8 9 11 12 14 15 17 18 20 21
请注意,即使您更改了循环起始值,您的2,3,6,7,10,11,14,15,18...
解决方案也无法处理此情况...
您需要为c
循环提供两个变量参数,一个用于起始值,另一个用于增量。
示例批处理文件(test.cmd):
for
用法:
@echo off
setlocal enabledelayedexpansion
for /l %%n in (%1 %2 20) do (
set /a _next=%%n+1
echo %%n !_next!
)
)
endlocal
答案 1 :(得分:4)
我会使用一个增量为3的循环。
@echo off
setlocal EnableDelayedExpansion
REM Building a test array
for /L %%n in (1 1 12) do set "arr[%%n]=_%%n_"
for /L %%n in (1 3 12) do (
set /a idxAddOne=%%n+1
for %%m in (!idxAddOne!) do echo !arr[%%n]! !arr[%%m]!
)
主要问题是代码块内部的扩展
计算idx + 1可以使用set /a idxAddOne=%%n+1
来完成,但是使用新索引有点棘手,因为你想要数组的内容。
我在这里使用额外的for循环将索引复制到新的参数变量%%m
它也可以通过CALL
的双重扩展来解决。
call echo !arr[%%n]! %%arr[!idxAddOne!]%%