Batch file for循环中的多个条件

Batch file for循环中的多个条件,batch-file,scripting,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_88888和TC_88888\u Test1\u Read执行操作,下次使用TC_9999和TC_9999\u

我需要编写一个批处理文件,如下所述:

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\u Test1\u Read
执行操作,下次使用
TC_9999
TC_9999\u Test2\u Write
执行操作

继续,直到列表结束。。。我在这两个列表中的项目总数约为30个。 两个列表中的项目数相同

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

请为我提供带有for-loop或任何替代方案的解决方案。

@ECHO OFF
SETLOCAL enabledelayedexpansion
测试用例列表
设置测试用例列表=(TC_8888,TC_9999)
试验方法清单
设置测试方法列表=(TC_8888_Test1_Read,TC_9999_Test2_Write)
设置计数=0
对于%TESTCASE\u列表中的%%i%DO SET/a count+=1&SET$!计数!=%%我
设置计数=0
对于%%i IN%TESTMETHODS\u LIST%DO SET/a count+=1&调用echo case%%$!计数!%%使用方法%%i
后藤:EOF
很简单-如果你想这样做的话


根据进一步信息进行修改

@ECHO关闭
SETLOCAL ENABLEDELAYEDEXPANSION
::设置在别处建立的变量

设置yymmdd\u hhmmss=日期和时间 设置文件名=文件名 测试用例列表 设置测试用例列表=(TC_8888,TC_9999) 试验方法清单 设置测试方法列表=(TC_8888_Test1_Read,TC_9999_Test2_Write) 设置计数=0 对于%TESTCASE\u列表中的%%i%DO SET/a count+=1&SET$!计数!=%%我 设置计数=0 对于%%j IN%TESTMETHODS\u列表%DO( 设置/a计数+=1 调用集大小写=%%$!计数!%% SET方法=%%j 调用:runtest ) 后藤:EOF :运行测试 设置trxfilename=%case%\uu%yymmd\uhhmmss%\u%file% ECHO“C:\ProgramFiles(x86)\Microsoft Visual Studio 10.0\Common7\IDE\mstest123”/test:%method%/resultsfile:“D:\TestResults\%trxfilename%” 后藤: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%
,因为它是在子例程的上下文中运行的,而不是在
中运行的

你也可以改为阅读

set ...list=whatever1,whatever2
for %%i in (%...list%) do ...
哪个可能更方便。实际上,如果您愿意,您可以从文件中读取列表。这样,您可以建立标准的测试集,比如
standard1
standard2
,然后只需将标准测试名称提供给此代码段,并在外部维护测试集

如果我们能处理问题的整个范围,而不是一个具体方面,那么就容易多了,也快多了


事实证明,整个问题似乎可以在一条逻辑线上解决:

对于(%templatefile%)中的/f“令牌=1-2”%%a(
ECHO“C:\Program Files(x86)\Microsoft Visual Studio 10.0\Common7\IDE\mstest123”/test:%%b/resultsfile:“D:\TestResults\%%a\uu%yymmd\u hhmmss%\u%file%”
)
其中提供了
file
yymmd\u hhmmss
,并且
templatefile
包含具有行的文件名

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


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

这里有一个解决方案,将延迟和双重扩展混为一谈

@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
    )
)

使用
%%1
%%2
等作为循环变量会让需要学习批处理脚本的人感到困惑。请使用a-z和a-z变量。我无法从上面的第二个列表中检索项目solution@user3151144:编辑以添加缺少的声明。我使用下面的代码获取日期和时间戳,并使用这些变量构建其他变量。对于/f“令牌=2-4 delims=/”%a in('date/t')do(设置mydate=%%c-%%a-%%b)对于/f“令牌=1-2 delims=/:“%%a in(“%TIME%”)do(设置mytime=%%a%%b)设置trxfilename=%case%%mydate%%mytime%%。当时间只有一位数,比如1:00到9:00时,我就遇到了问题。时间过了10点以后。变量工作正常。。。我希望脚本即使在时间少于9:00时也能工作…请在此设置yymmdd_hhmmss=DATE_和_时间设置trxfilename=%case%\u%yymmdd_hhmmss%\u%文件%上提供帮助。当我使用上面的日期和_时间创建带有时间戳的文件夹名称时,它无法工作,因为当小时从9变为10时,它会看到一个空格。。。不知道如何解决这个问题。上述脚本仅在10之前有效,而不是在10之后有效。上述解决方案效果良好。我需要用那两个variables@ECHOOFF SETLOCAL enabledelayedexpansion测试用例REM列表set TESTCASE_LIST=(TC_888;888,TC_9999)REM测试方法列表set TESTMETHODS_LIST=(TC_888;888 Test1_Read,TC_9999 Test2_Write)set count=0%i IN%TESTCASE_列表%DO set/a count+=1&set$!计数!=%%我在%TESTMETHODS\u列表%DO中为%%j设置了计数=0(SET/a计数+=1并调用echo case%%!计数!%%,方法%%j SET/a计数+=1并设置$!计数!=%j\u%%!计数!%%echo testid%%!计数!%%echo方法%%j)第一个集合和echo正在工作,但当我等待使用SET/a计数+=1并设置$!计数!=%%j_%%$!计数!%%这是失败的。请建议是做不到什么?你需要解释你打算做什么,因为你的方法显然不起作用。例如,
的第一个
设置
$1