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

soat7uwm  于 2023-05-19  发布在  Windows
关注(0)|答案(2)|浏览(235)

我想使用三个环境变量设置级别、环境和版本,以便使用不同的lvl、env和ver多次运行测试。我已经有了三个环境变量(数组/列表),我可以从中读取所有要设置的三个值。
我想迭代三个列表,以同时获得lvl、env和ver。我希望它是LVL 1,ENV 1,VER 1的第一次运行,然后LVL 2,ENV 2,VER 2的下一个等等。
我有这些设置在命令窗口,从那里我将启动我的进程

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设置为LVL 1,ENV 1和VER 1等等
这就是我尝试的,嵌套循环,但我不知道如何限制第二和第三循环来正确设置它,或者是否有其他方法来做。

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

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

igetnqfo

igetnqfo1#

  • 列表 * 和 * 数组 * 是非常不同的东西。这些是列表:
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===================
)

我建议你复习一下这个答案

oxalkeyp

oxalkeyp2#

根据描述的任务的简单解决方案将是:

@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。在三个for /F循环替换四个echo命令行之后,也可以在此批处理文件中包含RunTest.bat的代码,甚至可能替换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===================

要了解所使用的命令及其工作方式,请打开command prompt窗口,在那里执行以下命令,并仔细阅读显示的每个命令的帮助页面。

  • call /?
  • echo /?
  • exit /?
  • for /?
  • goto /?
  • set /?
  • setlocal /?

相关问题