【问题标题】:Windows batch to loop through values for variableWindows批处理循环遍历变量的值
【发布时间】:2019-05-15 15:42:53
【问题描述】:

我有一组主要的价值观和一个子集

主套装:Group1,Group2,Group3

子集:Group1_Sub1,Group1_Sub2,Group2_Sub1,Group3_Sub1,Group3_Sub2

Group1 ->Group1_Sub1 and Group1_Sub2

Group2 ->Group2_Sub1

Group3 ->Group3_Sub1,Group3_Sub2

对于每个主列表,我只想循环遍历其对应的子组列表并显示输出。

目前我正在使用以下代码

for %%s in (

Group1,Group2,Group3

    ) do (

        echo set Main Group %%s >> Log.txt

        for %%i in (
                    Group1_Sub1,Group1_Sub2,Group2_Sub1,Group3_Sub1,Group3_Sub2
                    ) do (
                        echo Main Group is %%s and its sub group is %%i >>Log.txt
                         )
            )

上面的代码会给我输出:

set Main Group Group1 
Main Grpup is Group1 and its sub group is Group1_Sub1 
Main Grpup is Group1 and its sub group is Group1_Sub2 
Main Grpup is Group1 and its sub group is Group2_Sub1 
Main Grpup is Group1 and its sub group is Group3_Sub1 
Main Grpup is Group1 and its sub group is Group3_Sub2 
set Main Group Group2 
Main Grpup is Group2 and its sub group is Group1_Sub1 
Main Grpup is Group2 and its sub group is Group1_Sub2 
Main Grpup is Group2 and its sub group is Group2_Sub1 
Main Grpup is Group2 and its sub group is Group3_Sub1 
Main Grpup is Group2 and its sub group is Group3_Sub2 
set Main Group Group3 
Main Grpup is Group3 and its sub group is Group1_Sub1 
Main Grpup is Group3 and its sub group is Group1_Sub2 
Main Grpup is Group3 and its sub group is Group2_Sub1 
Main Grpup is Group3 and its sub group is Group3_Sub1 
Main Grpup is Group3 and its sub group is Group3_Sub2 

我想限制他们只通过下面的相应列表

set Main Group Group1 
Main Grpup is Group1 and its sub group is Group1_Sub1 
Main Grpup is Group1 and its sub group is Group1_Sub2 
set Main Group Group2 
Main Grpup is Group2 and its sub group is Group2_Sub1 
set Main Group Group3  
Main Grpup is Group3 and its sub group is Group3_Sub1 
Main Grpup is Group3 and its sub group is Group3_Sub2 

我怎样才能做到这一点?

【问题讨论】:

  • IIUR 使用 for /f 解析具有不同长度变量名称的集合的输出,集合将输出具有给定前缀的 all 变量和他们的内容。
  • 您是否知道您的代码不访问任何变量,而只是通过连接字符串来生成输出?

标签: batch-file cmd batch-processing


【解决方案1】:

在内部 (%%i) 循环内:

    ECHO %%i|FINDSTR /b /i /L /c:"%%s_">nul
    IF NOT ERRORLEVEL 1 echo Main Group is %%s and its sub group is %%i >>Log.txt

Group1_Sub2 回显到findstr 中,它会查找以%%s 的当前值+ 下划线开头的字符串/b/i 表示不区分大小写,/L 表示文字比较,/c: 表示要检测的字符串。

如果findstr 找到它正在寻找的字符串,那么errorlevel 将被设置为0 或1,否则。 >nul 抑制输出。然后可以使用常规语法测试errorlevel

【讨论】:

    【解决方案2】:

    当您谈到变量时:以下代码自行查找主要组及其子组:

    @echo off
    setlocal enabledelayedexpansion
    
    REM following line just for generating test variables:
    for %%a in (1 2 3) do for %%b in (1 2 3 4) do set "Group%%a_Sub%%b=!random!"
    
    REM search MainGroups:
    for /f "delims=_" %%a in ('set group') do set "Main_%%a=Group"
    REM process each MainGroup
    for /f "tokens=2 delims=_=" %%a in ('set Main_') do (
      echo set Main Group %%a
      for /f "delims==" %%b in ('set %%a_') do (
        echo Main Group is %%a and its sub group is %%b and its content is !%%b!
      )
    )
    

    专业版:无需对每个变量名进行硬编码
    Con (?):不列出空的(不存在的)变量(根据您的需要,这甚至可以是另一个 Pro)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多