loops - 批量使用多个 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 更新实用程序更新)
解决方案
这将创建变量 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
推荐阅读
- php - 如何更新嵌套 Laravel 集合中的嵌套值
- mysql - Laravel查询goup by,multipe coulmn count with groupby
- swift - Xcode 13 beta 5 错误:UIViewController 缺少初始化期间填充的初始特征集合
- scala - 如何通过从提供自定义架构的表中派生来定义数据框的架构?
- python - 计算欧几里得距离小于某个值的随机对
- java - 如何从列表/集合和自定义比较器在 Java 中以 O(N) 创建优先级队列
- javascript - 如何使用 getUsermedia 和 mediaRecorder 下载录音并给出视频规范?
- asp.net-core - 如何将 System.Security.Claims.ClaimsPrincipal 定义为 gRPC 中的请求参数?
- c++ - 无法在 C++ 中使用列表创建生产者-消费者实例
- asp.net - 可以在 Blazor Server 应用程序中使用区域吗?