【问题标题】:for loop with several vars (arrays) to change each run带有多个变量(数组)的 for 循环来更改每次运行
【发布时间】:2013-12-12 22:38:01
【问题描述】:

如何在每次运行时在 for 循环中更改不同的变量?

假设:

for %%i in ( 
              VAR:RUN1,RUN2,RUN3,RUN4,RUN5,RUN6,RUN7,RUN8,RUN9
             var1:1,2,3,4,5,6,7,8,9 
             var2:10,20,30,40,50,60,70,80,90 
             var3:a,b,c,d,e,f,g,h,i 
             var4:x,y,x,y,x,y,x,y,x 
                                                ) do (

echo %var1% %var2% %var3% %var4% 

)

虽然有例如每个 var 有 9 个不同的值?

或以更好的方式订购 vars:

for %%i in ( 
          LoopRUN:VAR1,VAR2,VAR3,VAR4
             run1:1,10,a,x 
             run2:2,20,b,y
             run3:3,30,c,x 
             run4:4,40,d,y 
             run5:5,50,e,x 
             run6:6,60,f,y 
             run7:7,70,g,x 
             run8:8,80,h,y 
             run9:9,90,i,x 
                                                ) do (

echo %var1% %var2% %var3% %var4% 

)

这应该是这样的:

       C:\>1,10,a,x 
       2,20,b,y
       3,30,c,x 
       4,40,d,y 
       5,50,e,x 
       6,60,f,y 
       7,70,g,x 
       8,80,h,y 
       9,90,i,x 

编辑:

我看不到如何清楚地获得变量和调用之间的对应关系。

这有点困难,而不是“回声”,同样在每个运行/循环中都有一个调用:

"command /S %VAR1% -subswitch %VAR2% /H %VAR3% -o %VAR4%"

解释:

通过选择的解决方案,可以使用 REM 线来保持运行概览:

REM Devicegroup A
run1
run2
run3
REM Devicegroup B
run4
run5
REM

即使忘记设置一个 VAR,这是由代码处理的,唯一的问题是如果您再次使用“run[x]...”,因此请注意您的运行编号!

虽然运行不是按自然顺序进行的,但不知道我们是否能抓住这一点。见输出:

command /S 10 -subswitch 10 /H a -o x
command /S 11 -subswitch 10 /H a -o x
command /S 12 -subswitch 20 /H b -o y
command /S 13 -subswitch 30 /H c -o x
command /S 14 -subswitch 40 /H d -o y
command /S 15 -subswitch 50 /H e -o x
ERROR: Missing variable in run[16]
command /S 17 -subswitch 70 /H g -o x
command /S 18 -subswitch 80 /H h -o y
command /S 19 -subswitch 90 /H i -o x
command /S 1 -subswitch 10 /H a -o x
command /S 20 -subswitch 20 /H b -o y
command /S 2 -subswitch 20 /H b -o y
command /S 3 -subswitch 30 /H c -o x
command /S 4 -subswitch 40 /H d -o y
command /S 5 -subswitch 50 /H e -o x
ERROR: Missing variable in run[6]
command /S 7 -subswitch 70 /H g -o x
command /S 8 -subswitch 80 /H h -o y
command /S 9 -subswitch 90 /H i -o x

【问题讨论】:

  • 请在您的代码中显示array
  • 你需要说出你到底想做什么。修复没有做你没有指定的事情的代码是一个猜谜游戏。
  • @Endoro 准确地说有 9 个 :)
  • @Magoo 我需要多次发送带有 4 个不同变量的命令,并且每次都为每个变量发送不同的值。
  • 请注意,run 9 times with 4 variablesrun 4 times with 9 variables完全不同:“有 9 个数组...或 4 个,具体取决于排列 9x4 或 4x9 变量的方式。而我更愿意去 9 次 4 vars" (?)

标签: batch-file for-loop batch-processing var


【解决方案1】:

另一个!

@echo off
setlocal EnableDelayedExpansion
set LF=^


rem ** Previous two empty lines required
set "vars=1,10,a,x;2,20,b,y;3,30,c,x;4,40,d,y;5,50,e,x;6,60,f,y;7,70,g,x;8,80,h,y;9,90,i,x"
for /F "tokens=1-4 delims=," %%A in ("%vars:;=!LF!%") do echo command /S %%A -subswitch %%B /H %%C -o %%D

输出:

command /S 1 -subswitch 10 /H a -o x
command /S 2 -subswitch 20 /H b -o y
command /S 3 -subswitch 30 /H c -o x
command /S 4 -subswitch 40 /H d -o y
command /S 5 -subswitch 50 /H e -o x
command /S 6 -subswitch 60 /H f -o y
command /S 7 -subswitch 70 /H g -o x
command /S 8 -subswitch 80 /H h -o y
command /S 9 -subswitch 90 /H i -o x

编辑添加新方法作为对 cme​​ts 的响应

上一个批处理文件是解决此问题的最简单方法。但是,如果您关心的是“保持其他同事可读的数组定义”,那么下面的方法可能会更清晰。该程序还解决了您对“包含一个测试,检查您是否真的有 4 个变量”的担忧:

@echo off
setlocal

rem Define the *array* of variables per run
set run[1]=1,10,a,x
set run[2]=2,20,b,y
set run[3]=3,30,c,x
set run[4]=4,40,d,y
set run[5]=5,50,e,x
set run[6]=6,60,f
set run[7]=7,70,g,x
set run[8]=8,80,h,y
set run[9]=9,90,i,x

for /F "tokens=1-5 delims==," %%A in ('set run[') do (
   if "%%E" neq "" (
      ECHO command /S %%B -subswitch %%C /H %%D -o %%E
   ) else (
      echo ERROR: Missing variable in %%A
   )
)

输出:

command /S 1 -subswitch 10 /H a -o x
command /S 2 -subswitch 20 /H b -o y
command /S 3 -subswitch 30 /H c -o x
command /S 4 -subswitch 40 /H d -o y
command /S 5 -subswitch 50 /H e -o x
ERROR: Missing variable in run[6]
command /S 7 -subswitch 70 /H g -o x
command /S 8 -subswitch 80 /H h -o y
command /S 9 -subswitch 90 /H i -o x

【讨论】:

  • 像往常一样,策划者展示了有趣的方式。虽然这里的数组不像 unclemeat 的示例那样清晰可读,但我正在考虑如何防止只有 3 个给定 vars 为 4 的运行。使用来自不同定义行的 vars 的运行将以灾难告终。
  • 仍然想知道你用空行代替,这里有什么诀窍?或者更好的是为什么以及如何使用而不是没有?
  • @peet:请参阅上面我的答案中的编辑。请注意,严格来说,您的问题中没有包含任何 array ;因此 Endoro 的评论:“请在您的代码中显示array”...
  • 感谢一百万漂亮且可读的代码,同时我确实阅读了有关批处理和数组的信息,并且:是的,endoro 在批处理中没有真正的数组,而至少这是一个(关联)的近似值数组 - 尽可能多地批量实现。先生 :) 将 uncleeat 的解决方案标记为第一个正确的解决方案对您公平吗?
  • 我的意思是,在您的代码中,您不会编写任何批处理 array 只是一些逗号分隔值的 lists,所以我的第一个解决方案使用更大系列的逗号分隔值,更易于管理。可以以其他编程语言的等效方式管理批处理文件中的数组;见this post。我认为“最佳答案”应该是您用来解决问题的答案,但您可以选择任何您想要的;对我来说没关系! ;-)
【解决方案2】:
@ECHO OFF
SETLOCAL
for %%r in (  "run1:1,10,a,x",
             "run2:2,20,b,y",
             "run3:3,30,c,x",
             "run4:4,40,d,y",
             "run5:5,50,e,x",
             "run6:6,60,f,y",
             "run7:7,70,g,x",
             "run8:8,80,h,y",
             "run9:9,90,i,x"
 ) DO (
 for /f "tokens=2delims=:" %%i in ("%%~r") do (
  echo %%i
 )
)
GOTO :EOF

应该产生你要求的输出。

【讨论】:

  • 哈哈,以几乎相同的答案击败你,除了你没有将四个值提取到单独的变量中。为什么包含"run1:" "run2:" 等?
  • @unclemeat 是的 - 看到您的帖子并检查相似性。仍然不清楚数据格式有多灵活,是否实际来自文件,是否需要设置 4 个变量,或者是否会以逗号分隔的字符串作为参数调用子程序。决定准确地制作所要求的内容 - 但在我的剪贴板上写入了相同的技术,所以 - 发布并按照他们所说的那样被诅咒...... :)
  • 很公平。虽然还不清楚,但我认为他可能希望将它们放在单独的变量中,因为他的问题中有一行 - echo %var1% %var2% %var3% %var4%
  • 我说得对吗,在 unclemeat 的示例中,变量仅按分隔符“,”排序,而在您的第一个按行排序,然后按“:”排序?
  • @peet 鉴于您的最新编辑,使用 unclemeat 的版本并将 echo %%A... 替换为 command /S %%A -subswitch %%B /H %%C -o %%D
【解决方案3】:
@echo off

for %%i in (
    "1,10,a,x"
    "2,20,b,y"
    "3,30,c,x"
    "4,40,d,y" 
    "5,50,e,x" 
    "6,60,f,y" 
    "7,70,g,x" 
    "8,80,h,y" 
    "9,90,i,x"
) do for /f "delims=, tokens=1-4" %%A in ("%%~i") do (
    echo %%A %%B %%C %%D
)

%%A%%D可以对应你的%var1%%var4%

如果您需要任何解释,请告诉我。

【讨论】:

  • command /S %%A -subswitch %%B /H %%C -o %%D 这也适用于您的循环吗?
  • 应该肯定有效。试试看,让我知道。在 echo 之后添加它 - 或用您的命令替换 echo。
  • 虽然'echo %%~i' 可以有效地替换为"%%~i"
  • 是的,你就是这样——更干净一点。干杯。
  • @peet,如果这对您有用,请将其标记为正确答案。如果没有,请告诉我。
【解决方案4】:
@ECHO OFF &SETLOCAL
setlocal EnableDelayedExpansion

set $VAR=RUN1,RUN2,RUN3,RUN4,RUN5,RUN6,RUN7,RUN8,RUN9
set var1=1,2,3,4,5,6,7,8,9
set var2=10,20,30,40,50,60,70,80,90
set var3=a,b,c,d,e,f,g,h,i
set var4=x,y,x,y,x,y,x,y,x

call:Send 4
exit /b

:send
set $c=1
for %%a in (%$var:,= %) do (echo %%a
                            set $run=
                            call:final %1
                            set /a $c+=1)                                
exit /b

:final    
for /l %%b in (1,1,%1) do (set $liste=!var%%b!
                           for /f "tokens=%$c% delims=," %%x in ('echo !$liste!') do set $run=!$run! %%x)

set $c1=1
set $comm=
for %%a in (!$run!) do (if !$c1! equ 1 set $Comm=Command /s %%a
                        if !$c1! equ 2 set $comm=!$comm! -subswitch %%a /H
                        if !$c1! equ 3 set $comm=!$comm! %%a -O
                        if !$c1! equ 4 set $comm=!$comm! %%a
                        set /a $c1+=1)

echo !$comm!

【讨论】:

  • 看起来非常令人印象深刻,虽然我更愿意去 9 次 4 vars,而你的例子可以让我猜 shure 给出 4 个 vars,而我不知道如何:)
  • 你想包括一个测试,谁来检查你是否真的有 4 个变量?
  • 漂亮而结构化的代码,而我的同事没有一个可以遵循它,哈哈。结构的顶层也是相反的 9 乘以 4 vars。无论如何,谢谢你,也许你可以帮助我here
猜你喜欢
  • 2021-11-25
  • 2014-06-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-30
相关资源
最近更新 更多