在批处理文件中一次循环两个列表

时间:2017-09-21 17:43:45

标签: arrays list batch-file

我是新手使用批处理文件。我正在尝试运行一个程序,我用几乎不同的命令行参数编写了几次。为了做到这一点,我制作了两个包含不同参数的列表。然后我想迭代这两个列表,但是我对如何从循环中从列表中获取项目感到困惑。 (浏览批处理教程和其他线程没有帮助。)

我的批次代码如下:

set D=("airplanebase.xml","catfacebase.xml","churchbase.xml","coffee_cupbase.xml","hutbase.xml","maskbase.xml","pumpkinbase.xml","spacebase.xml")
set C=("186.svg","187.svg","188.svg","189.svg","190.svg","191.svg","192.svg","193.svg")
FOR /l %%A IN (0,1,7) DO (
CurvedNonogramsGenerator.exe file=%D[%%A]% outfile=%C[%%A]% -af -am cratio="0" outdir="\output\\" weights="1000,3,3,7,0" temp="1.001" pairits="0"
)

当我尝试运行它时,回声说它正在调用我的程序:

CurvedNonogramsGenerator.exe file= outfile= -af -am cratio="0" outdir="C:\Users\DeMeessias\Documents\1. Studie\0.MasterThesis\output\\" weights="1000,3,3,7,0" temp="1.001" pairits="0"

它还会给出一个错误,指出索引超出了矩阵的范围。 正如您所看到的那样,我试图从列表中获取的两个参数都留空了。

我真的很困惑%运算符的工作方式。我也见过使用过的教程!作为从列表中获取东西的运算符,但这似乎也不起作用。它被视为!只是随机文本而不是运算符。

那么如何让它正确加载列表中的参数?

编辑: 因此,根据评论的建议,我将批处理文件更改为:

set D[0]="airplanebase.xml"
set D[1]="catfacebase.xml"
set D[2]="churchbase.xml"
set D[3]="coffee_cupbase.xml"
set D[4]="hutbase.xml"
set D[5]="maskbase.xml"
set D[7]="pumpkinbase.xml"
set D[8]="spacebase.xml"
set C[0]="186.svg"
set C[1]="187.svg"
set C[2]="188.svg"
set C[3]="189.svg"
set C[4]="190.svg"
set C[5]="191.svg"
set C[6]="192.svg"
set C[7]="193.svg"
FOR /l %%A IN (0,1,7) DO (
CurvedNonogramsGenerator.exe file=!D[%%A]! outfile=!C[%%A]! -af -am cratio="0" outdir="C:\Users\DeMeessias\Documents\1. Studie\0.MasterThesis\output\\" weights="1000,3,3,7,0" temp="1.001" pairits="0"
)

但这并不能解决问题...... 回声现在说它调用我的程序就像

CurvedNonogramsGenerator.exe file=!D[0]! outfile=!C[0]! -af -am cratio="0" outdir="C:\Users\DeMeessias\Documents\1. Studie\0.MasterThesis\output\\" weights="1000,3,3,7,0" temp="1.001" pairits="0"

再次给出索引越界错误...

编辑2:将setlocal EnableDelayedExpansion添加到文件顶部修复它!感谢大家的帮助。

1 个答案:

答案 0 :(得分:0)

有几种方法可以解决这个问题。下面的方法很简单:

@echo off
setlocal EnableDelayedExpansion

set D="airplanebase.xml","catfacebase.xml","churchbase.xml","coffee_cupbase.xml","hutbase.xml","maskbase.xml","pumpkinbase.xml","spacebase.xml"
set C="186.svg","187.svg","188.svg","189.svg","190.svg","191.svg","192.svg","193.svg"

for %%C in (%C%) do (
   for /F "tokens=1* delims=," %%D in ("!D!") do (
      ECHO CurvedNonogramsGenerator.exe file=%%D outfile=%%C -af -am cratio="0" outdir="\output\\" weights="1000,3,3,7,0" temp="1.001" pairits="0"
      set "D=%%E"
   )
)

您也可以列表转换为arrays,这样您就可以使用原始方法;那就是:

@echo off
setlocal EnableDelayedExpansion

set D="airplanebase.xml","catfacebase.xml","churchbase.xml","coffee_cupbase.xml","hutbase.xml","maskbase.xml","pumpkinbase.xml","spacebase.xml"
set C="186.svg","187.svg","188.svg","189.svg","190.svg","191.svg","192.svg","193.svg"

rem Convert the lists into arrays
set i=0
for %%D in (%D%) do (
   set /A i+=1
   set "D[!i!]=%%D"
)
set i=0
for %%C in (%C%) do (
   set /A i+=1
   set "C[!i!]=%%C"
)

for /L %%A in (1,1,%i%) do (
   ECHO CurvedNonogramsGenerator.exe file=!D[%%A]! outfile=!C[%%A]! -af -am cratio="0" outdir="\output\\" weights="1000,3,3,7,0" temp="1.001" pairits="0"
)