for循环中的多个条件

时间:2014-01-01 12:41:25

标签: batch-file scripting

我需要编写如下所述的批处理文件:

REM LIST OF TEST CASES

set TESTCASE_LIST=(TC_88888,TC_99999)

REM LIST OF TEST METHODS

set TESTMETHODS_LIST=(TC_88888_Test1_Read,TC_99999_Test2_Write)

我想从两个列表中获取第一个项目,并使用TC_88888TC_88888_Test1_Read以及下次TC_99999TC_99999_Test2_Write执行操作并执行行动..

继续直到列表结尾...我在两个列表中的总项目大约为30。 两个列表中的项目数相同。

这可以使用带有两个条件变量的for循环来实现,以便将两个集合访问为两个不同的变量并根据需要使用它们。我不确定批处理脚本中是否提供此项提示? (其他语言如C,C ++将提供在for循环中具有两个条件的选项)..

请使用for循环或任何替代方案向我提供解决方案。

2 个答案:

答案 0 :(得分:1)

@ECHO OFF
SETLOCAL enabledelayedexpansion
REM LIST OF TEST CASES
set TESTCASE_LIST=(TC_88888,TC_99999)
REM LIST OF TEST METHODS
set TESTMETHODS_LIST=(TC_88888_Test1_Read,TC_99999_Test2_Write)

SET count=0
FOR %%i IN %TESTCASE_LIST% DO SET /a count+=1&SET $!count!=%%i
SET count=0
FOR %%i IN %TESTMETHODS_LIST% DO SET /a count+=1&CALL echo case %%$!count!%% with method %%i
GOTO :EOF

足够简单 - 如果这是你想要的方式。


根据进一步的信息进行修改

@ECHO OFF 
SETLOCAL ENABLEDELAYEDEXPANSION
:: Setting variable established elsewhere
SET yymmdd_hhmmss=DATE_AND_TIME
SET file=FILENAME
REM LIST OF TEST CASES 
set TESTCASE_LIST=(TC_88888,TC_99999) 
REM LIST OF TEST METHODS 
set TESTMETHODS_LIST=(TC_88888_Test1_Read,TC_99999_Test2_Write) 
SET count=0 
FOR %%i IN %TESTCASE_LIST% DO SET /a count+=1&SET $!count!=%%i
SET count=0
FOR %%j IN %TESTMETHODS_LIST% DO ( 
 SET /a count+=1
 CALL SET case=%%$!count!%%
 SET method=%%j
 CALL :runtest
) 
GOTO :EOF
:runtest
SET trxfilename=%case%_%yymmdd_hhmmss%_%file%
ECHO "C:\Program Files (x86)\Microsoft Visual Studio 10.0\Common7\IDE\mstest123" /test:%method% /resultsfile:"D:\TestResults\%trxfilename%"
GOTO :EOF

结果:

"C:\Program Files (x86)\Microsoft Visual Studio 10.0\Common7\IDE\mstest123" /test:TC_88888_Test1_Read /resultsfile:"D:\TestResults\TC_88888_DATE_AND_TIME_FILENAME"
"C:\Program Files (x86)\Microsoft Visual Studio 10.0\Common7\IDE\mstest123" /test:TC_99999_Test2_Write /resultsfile:"D:\TestResults\TC_99999_DATE_AND_TIME_FILENAME"

请注意,我不知道您在哪里设置日期和时间字符串或文件名。

runtest例程中,您可以使用%var%,因为它在子例程的上下文中运行,而不是for

您也可以更改为阅读

set ...list=whatever1,whatever2
for %%i in (%...list%) do ...

这可能更方便。实际上,如果您愿意,可以从文件中读取列表。这样,您可以建立标准的测试集,例如standard1standard2,然后只需将标准测试名称提供给此代码段并在外部维护测试集。

如果我们能够处理问题的整个范围而不是一个特定的方面,那么就会更轻松,更轻松。


事实证明,整个问题似乎可以在一个LOGICAL行中解决:

for /f "tokens=1-2" %%a in (%templatefile%) do (
  ECHO "C:\Program Files (x86)\Microsoft Visual Studio 10.0\Common7\IDE\mstest123" /test:%%b /resultsfile:"D:\TestResults\%%a_%yymmdd_hhmmss%_%file%"
)

提供fileyymmdd_hhmmss的地方,templatefile包含有行的文件的名称

TC_88888,TC_88888_Test1_Read
TC_99999,TC_99999_Test2_Write

更改模板文件名 - 更改应用的测试集。想要更改模板文件中每行替换的参数数量?将1-2更改为1-3,第三个参数显示为%%c

只需指定问题,而不是方法。

答案 1 :(得分:-1)

这是一个解决延迟和双重扩展的解决方案。

@echo off
setlocal enabledelayedexpansion

set list1=a,b,c
set list2=1,2,3,$

for %%1 in (%list1%) do (
    set x=!list2!
    set list2=!list2:*,=!
    call set x2=%%x:,!list2!=%%
    echo %%1 !x2!
)

显示:

a 1
b 2
c 3

它可以很容易地适应您的问题。请注意第二个列表末尾的额外“,$”。

避免双重扩展和使用cmd标记功能的第二种解决方案:

for %%1 in (%list1%) do (
    for /F "delims=," %%2 in ("!list2!") do set x2=%%2
    set list2=!list2:*,=!
    echo %%1 !x2!
)

最后,完全使用标记化的解决方案:

@echo off
setlocal enabledelayedexpansion

set list1=a,b,c
set list2=1,2,3

for %%1 in (%list1%) do (
    for /F "delims=, tokens=1*" %%2 in ("!list2!") do (
        echo %%1 %%2
        set list2=%%3
    )
)