Использование нескольких циклов for в пакете - PullRequest
0 голосов
/ 01 апреля 2019

Ниже приведен код, над которым я работаю

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: Строить = 160: Адаптер = хуг | а | JKL | EFG

Здесь я пытаюсь выполнить развертывание для каждого компонента

Компонент = xyz.zip | abc.zip | jkl.zip | efg.zip

путем обновления SVN для каждого адаптера

хуг | а | JKL | EFG

Мне нужно последовательно разделить Компонент и Адаптер и передать его для развертывания команды один за другим. Также перед запуском развертывания мне нужно использовать каждый компонент, соответствующий адаптеру, для получения обновления SVN (например, если: для развертывания запускается компонент xyz.zip Адаптер xyz должен сначала обновляться утилитой обновления SVN)

Ответы [ 2 ]

4 голосов
/ 01 апреля 2019

Создаются переменные 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

Пояснение

Theкод просто заменяет все вхождения разделителя на "&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 , который представил эту технику, см. разбить строку на подстроки на основе разделителя

1 голос
/ 01 апреля 2019

Я до сих пор не понимаю, что вы действительно хотите сделать, но, возможно, это может вам помочь:

@echo off
setlocal

set "Component=xyz.zip|abc.zip|jkl.zip|efg.zip"

for %%a in ("%Component:|=" "%") do (
   echo With extension: %%~a
   echo Without extension: %%~Na
)

РЕДАКТИРОВАТЬ : Добавлен новый метод

Пожалуйста, просмотрите этот код:

@echo off
setlocal EnableDelayedExpansion

rem Parameter_Build file contains text in below format :-
rem Environment=:Domain=:Component=xyz.zip|abc.zip|jkl.zip|efg.zip:Build=160:Adapter=xyz|abc|jkl|efg

rem Read the file:
set /P "line=" < Parameter_Build.txt
echo Line read:
echo !line!

rem Separate variables:
set "%line::=" & set "%"

rem Separate Component and Adapter in *matching* parts
set cnt=1
set "Component[1]=%Component:|=" & set /A cnt+=1 & set "Component[!cnt!]=%"
set cnt=1
set "Adapter[1]=%Adapter:|=" & set /A cnt+=1 & set "Adapter[!cnt!]=%"

rem Ok:
for /L %%i in (1,1,%cnt%) do echo Component[%%i]=!Component[%%i]!, Adapter[%%i]=!Adapter[%%i]!

Пример вывода:

Line read:
Environment=:Domain=:Component=xyz.zip|abc.zip|jkl.zip|efg.zip:Build=160:Adapter=xyz|abc|jkl|efg
Component[1]=xyz.zip, Adapter[1]=xyz
Component[2]=abc.zip, Adapter[2]=abc
Component[3]=jkl.zip, Adapter[3]=jkl
Component[4]=efg.zip, Adapter[4]=efg
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...