如何同时迭代批处理脚本中的多个数组/列表?

问题描述 投票:0回答:2

我想使用三个环境变量设置级别、环境和版本,以使用不同的 lvl、env 和 ver 多次运行测试。 我已经有了三个环境变量(数组/列表),我可以从中读取要设置的所有三个值。

我想迭代三个列表以同时获取 lvl、env 和 ver。 我希望第一次运行时为 LVL1、ENV1、VER1,然后下次运行时为 LVL2、ENV2、VER2,依此类推。

我在命令窗口中设置了这些,我将在其中启动我的进程

set LVL_VAR=LVL1 LVL2 LVL3
set ENV_VAR=ENV1 ENV2 ENV3
set VER_VAR=VER1 VER2 VER3

我可以阅读这三个来获得lvl、env、ver 然后我需要在运行 RunTest.bat 之前将变量 LVL、ENV 和 VER 设置为 LVL1、ENV1 和 VER1 等

这是我尝试过的,嵌套循环,但我不知道如何限制第二个和第三个循环以正确设置它,或者是否有其他方法可以做到这一点。

@echo OFF
for %%L in (%LVL_VAR%) do call :for_lvl %%L
    
exit /b

:for_lvl
    set LVL=%1
    echo LVL %LVL%
    for %%E in (%ENV_VAR%) do call :for_env %%E
    exit /b
    goto :cont
  :cont
exit /b

:for_env
    set ENV=%1
    echo ENV %ENV%
    for %%V in (%VER_VAR%) do call :for_ver %%V
    goto :cont
  :cont
    exit /b
exit /b

:for_ver
    set VER=%1
    echo VER %VER%
    echo =======================RunTest.bat===================
exit /b

我得到的明显输出是

LVL LVL1
ENV ENV1
VER VER1
=======================RunTest.bat===================
VER VER2
=======================RunTest.bat===================
VER VER3
=======================RunTest.bat===================
ENV ENV2
VER VER1
=======================RunTest.bat===================
VER VER2
=======================RunTest.bat===================
VER VER3
=======================RunTest.bat===================
ENV ENV3
VER VER1
=======================RunTest.bat===================
VER VER2
=======================RunTest.bat===================
VER VER3
=======================RunTest.bat===================
LVL LVL2
ENV ENV1
VER VER1
=======================RunTest.bat===================
VER VER2
=======================RunTest.bat===================
VER VER3
=======================RunTest.bat===================
ENV ENV2
VER VER1
=======================RunTest.bat===================
VER VER2
=======================RunTest.bat===================
VER VER3
=======================RunTest.bat===================
ENV ENV3
VER VER1
=======================RunTest.bat===================
VER VER2
=======================RunTest.bat===================
VER VER3
=======================RunTest.bat===================
LVL LVL3
ENV ENV1
VER VER1
=======================RunTest.bat===================
VER VER2
=======================RunTest.bat===================
VER VER3
=======================RunTest.bat===================
ENV ENV2
VER VER1
=======================RunTest.bat===================
VER VER2
=======================RunTest.bat===================
VER VER3
=======================RunTest.bat===================
ENV ENV3
VER VER1
=======================RunTest.bat===================
VER VER2
=======================RunTest.bat===================
VER VER3
=======================RunTest.bat===================

我需要它像这样

LVL LVL1
ENV ENV1
VER VER1
=======================RunTest.bat===================
LVL LVL2
ENV ENV2
VER VER2
=======================RunTest.bat===================
LVL LVL3
ENV ENV3
VER VER3
=======================RunTest.bat===================

如何限制我的迭代次数或者还有其他方法吗?

windows list batch-file
2个回答
0
投票

列表数组是非常不同的东西。这些是列表:

set LVL_VAR=LVL1 LVL2 LVL3
set ENV_VAR=ENV1 ENV2 ENV3
set VER_VAR=VER1 VER2 VER3

您可以通过这种方式将列表转换为数组:

setlocal EnableDelayedExpansion

set n=0
for %%a in (%LVL_VAR%) do set /A n+=1 & set "LVL[!n!]=%%a"
set n=0
for %%a in (%ENV_VAR%) do set /A n+=1 & set "ENV[!n!]=%%a"
set n=0
for %%a in (%VER_VAR%) do set /A n+=1 & set "VER[!n!]=%%a"
rem Keep here the last value of %n%

...然后通过下标或者索引同时处理三个数组:

for /L %%i in (1,1,%n%) do (
   echo LVL !LVL[%%i]!
   echo ENV !ENV[%%i]!
   echo VER !VER[%%i]!
   echo =======================RunTest.bat===================
)

我建议您查看这个答案


0
投票

根据描述,该任务的一个简单解决方案是:

@echo off
setlocal EnableExtensions DisableDelayedExpansion
set "LVL_VAR=LVL1 LVL2 LVL3"
set "ENV_VAR=ENV1 ENV2 ENV3"
set "VER_VAR=VER1 VER2 VER3"
(for /L %%I in (1,1,3) do call :RunTest %%I) & exit /B
:RunTest
for /F "tokens=%1" %%J in ("%LVL_VAR%") do set "LVL=%%J"
for /F "tokens=%1" %%J in ("%ENV_VAR%") do set "ENV=%%J"
for /F "tokens=%1" %%J in ("%VER_VAR%") do set "VER=%%J"
echo LVL %LVL%
echo ENV %ENV%
echo VER %VER%
echo =======================RunTest.bat===================
goto :EOF

四个

echo
命令行应替换为
call RunTest.bat
。还可以在三个
RunTest.bat
循环替换四个
for /F
命令行之后在此批处理文件中包含
echo
的代码,甚至可能包括
goto :EOF
以减少运行此批处理文件时的文件系统访问。

如果三个环境变量的三个值本身包含空格(如水平制表符或竖线),也可以使用不同的分隔符代替空格,如下所示:

@echo off
setlocal EnableExtensions DisableDelayedExpansion
set "LVL_VAR=LVL1|LVL2|LVL3"
set "ENV_VAR=ENV1|ENV2|ENV3"
set "VER_VAR=VER1|VER2|VER3"
(for /L %%I in (1,1,3) do call :RunTest %%I) & exit /B
:RunTest
for /F "tokens=%1 delims=|" %%J in ("%LVL_VAR%") do set "LVL=%%J"
for /F "tokens=%1 delims=|" %%J in ("%ENV_VAR%") do set "ENV=%%J"
for /F "tokens=%1 delims=|" %%J in ("%VER_VAR%") do set "VER=%%J"
echo LVL %LVL%
echo ENV %ENV%
echo VER %VER%
echo =======================RunTest.bat===================

要了解所使用的命令及其工作原理,请打开命令提示符窗口,执行以下命令,并完整、仔细地阅读每个命令显示的帮助页面。

  • call /?
  • echo /?
  • exit /?
  • for /?
  • goto /?
  • set /?
  • setlocal /?
© www.soinside.com 2019 - 2024. All rights reserved.