我需要编写如下所述的批处理文件:
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_88888
和TC_88888_Test1_Read
以及下次TC_99999
和TC_99999_Test2_Write
执行操作并执行行动..
继续直到列表结尾...我在两个列表中的总项目大约为30。 两个列表中的项目数相同。
这可以使用带有两个条件变量的for循环来实现,以便将两个集合访问为两个不同的变量并根据需要使用它们。我不确定批处理脚本中是否提供此项提示? (其他语言如C,C ++将提供在for循环中具有两个条件的选项)..
请使用for循环或任何替代方案向我提供解决方案。
答案 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 ...
这可能更方便。实际上,如果您愿意,可以从文件中读取列表。这样,您可以建立标准的测试集,例如standard1
和standard2
,然后只需将标准测试名称提供给此代码段并在外部维护测试集。
如果我们能够处理问题的整个范围而不是一个特定的方面,那么就会更轻松,更轻松。
事实证明,整个问题似乎可以在一个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%"
)
提供file
和yymmdd_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
)
)