在Windows批处理文件中如何回显或更确切地索引数组中的第(n + 1)个元素?

时间:2016-07-31 05:10:26

标签: arrays batch-file indexing

我有一个批处理脚本,它收集数据并将其插入名为输出的数组 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循环,执行也可以。

2 个答案:

答案 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

进一步阅读

  • An A-Z Index of the Windows CMD command line - 与Windows cmd相关的所有内容的绝佳参考。
  • for /l - 有条件地为一系列数字执行命令。
  • if - 有条件地执行命令。
  • set - 显示,设置或删除CMD环境变量。使用SET进行的更改将仅在当前CMD会话期间保留。

答案 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!]%%