首页 > 解决方案 > 批量使用多个 for 循环

问题描述

下面是我正在处理的代码

setlocal enabledelayedexpansion
echo on

IF NOT EXIST "D:\Deployments\Parameter_Build*.txt" (
exit
)
set SCRIPTDIRECTORY=D:\Deployments\
PUSHD %SCRIPTDIRECTORY%
FOR %%A in (Parameter_Build*.txt) DO (
echo %%A

set ANT_HOME=C:\tibco\ant\apache-ant-1.9.13
set string=
set /p string=< D:\Deployments\%%A
echo string is !string!
echo before for loop
call :myInnerloop !string!

 )
POPD
GOTO:EOF

rem *************************************************************

:myInnerloop
FOR /F "tokens=2,4,6,8,10 delims==:" %%G IN ("!string!") DO (
echo inside for loop
set COMPONENTDIR="D:\kpn_eai\EAI_FIXED\branches\kpn_eai_fixed\fixed\components"
set CONFIGDIR="D:\kpn_eai\EAI_FIXED\branches\kpn_eai_fixed\fixed\configuration\components"
set ADAPTER=%%K

echo %%G %%H %%I %%J %%K

echo value taken from file is !string! >> D:\Deployments\logs\Deployment-%%J.log 2>&1
svn update !COMPONENTDIR!\!ADAPTER! >> D:\Deployments\logs\Deployment-%%J.log 2>&1
svn update !CONFIGDIR!\!ADAPTER! >> D:\Deployments\logs\Deployment-%%J.log 2>&1


echo Starting with deployment with parameters %%G %%H %%I >> D:\Deployments\logs\Deployment-%%J.log 2>&1
%ANT_HOME%\bin\xanteai deploy %%G %%H %%I >> D:\Deployments\logs\Deployment-%%J.log 2>&1
echo Deployment completed >> D:\Deployments\logs\Deployment-%%J.log 2>&1
move D:\Deployments\Parameter_Build-%%J.txt D:\Deployments\archive\Parameter_Build-%%J.txt
RENAME D:\Deployments\logs\Deployment.txt Deployment-%%J.log

 )
:next
GOTO:EOF



endlocal

Parameter_Build 文件包含以下格式的文本:-

环境=:域=:组件=xyz.zip|abc.zip|jkl.zip|efg.zip:Build=160:Adapter=xyz|abc|jkl|efg

在这里,我正在尝试为每个组件执行部署

组件=xyz.zip|abc.zip|jkl.zip|efg.zip

通过对每个适配器进行 SVN 更新

xyz|abc|jkl|efg

我需要将 Component 和 Adapter 连续分离,并将其传递给部署命令。同样在触发部署之前,我需要使用每个组件各自的适配器进行 SVN 更新(例如:如果组件 xyz.zip 被触发部署适配器 xyz 应该首先由 SVN 更新实用程序更新)

标签: loopsbatch-filetoken

解决方案


这将创建变量 a[0], a[1], ... a[n]

@echo off

setlocal EnableDelayedExpansion
set "var=xyz|abc|jkl|efg"

set cnt=0
set "a[0]=%var:|="&set /a cnt+=1&set "a[!cnt!]=%"

echo cnt=!cnt!
set a[

输出:

cnt=3
a[0]=xyz
a[1]=abc
a[2]=jkl
a[3]=efg

解释

该代码只是将所有出现的分隔符替换为"&set /a cnt+=1&set "a[!cnt!]=.
这看起来很奇怪,但作为例子它看起来像

set "a[0]=xyz"  & set /a cnt+=1  & set "a[!cnt!]=abc"  & set /a cnt+=1  & set "a[!cnt!]=jkl"  & set /a cnt+=1  & set "a[!cnt!]=efg"

当展开到多行时,它看起来像

set "a[0]=xyz"  
set /a cnt+=1  
set "a[!cnt!]=abc"  
set /a cnt+=1  
set "a[!cnt!]=jkl"  
set /a cnt+=1  
set "a[!cnt!]=efg"

换句话说,它为每个分隔符创建多个命令。

这种技术甚至可以与字符串分隔符一起使用,例如<->

set "a[0]=%var:<->=...

感谢@Aacini,他介绍了这个技术,看到split string into substrings based on delimiter


推荐阅读