Назначьте разные имена папок и файлов из каталога в переменную в пакете - PullRequest
0 голосов
/ 09 апреля 2019

Я пытаюсь назначить разные имена папок из данного каталога для разных переменных.

Я могу сделать то же самое в Unix, но это выглядит трудно достичь из партии.Ниже приведен код Unix.В файле Change.txt у меня есть количество строк, как показано ниже

branches/abc/xyz/components/ADAdapter/release/post_commit_hook.zip
branches/abc/xys/components/ADAdapter/release/post_commit_hook.zip
branches/abc/xyz/components/ADAdapter/release/post_commit_hook.zip
branches/abc/xyz/components/ADAdapter/release/post_commit_hook.zip
for x in `cat changed.txt`
do
a=`echo $x |egrep -i 'release'|egrep -i 'zip'| sed 's/.*release\///'| 
sed 's/^[ \t]*//;s/[ \t]*$//' `
b="$b,$a"
c=`echo $x | cut -d "/" -f1`
d=`echo $x | cut -d "/" -f5`
e="$e,$c"
f="$f,$d"
done
PACKAGE=`echo $b | sed 's/[,]//'`
BRANCH=`echo $e | sed 's/[,]//'`
UPDATEFOLDER=`echo $f | sed 's/[,]//'`
echo PACKAGE is $PACKAGE
echo BRANCH is $BRANCH
echo UPDATEFOLDER is $UPDATEFOLDER

Я ожидаю этот вывод

PACKAGE is post_commit_hook.zip,post_commit_hook.zip,post_commit_hook.zip,post_commit_hook.zip

BRANCH is branches,branches,branches,branches

UPDATEFOLDER is ADAdapter,ADAdapter,ADAdapter,ADAdapter

Может ли кто-нибудь помочь мне сделать то же самое с Batch?

1 Ответ

0 голосов
/ 09 апреля 2019

Вот пример, основанный на моем комментарии:

@Echo Off
SetLocal EnableDelayedExpansion

Rem This Undefines the variables
For %%A In (PKG BRN UPD) Do Set "%%A="

Rem This will propagate the variables
For /F "Tokens=1,5,7 Delims=/" %%A In (
    'FindStr /I "\/release/.*\.zip$" "changed.txt"'
) Do (
    If Defined BRN (Set "BRN=!BRN!,%%A") Else Set "BRN=%%A"
    If Defined UPD (Set "UPD=!UPD!,%%B") Else Set "UPD=%%B"
    If Defined PKG (Set "PKG=!PKG!,%%C") Else Set "PKG=%%C"
)

Rem This will show the variables with their content
For %%A In (PKG BRN UPD) Do Set %%A 2>Nul

Pause

[Редактировать /]
В результате acronicks комментариев, вот версия, которая должна быть достаточной в случае файла, использующего LF окончания строки или не заканчивающегося стандартным CRLF окончанием. Также изменяются имена переменных в соответствии с именами в вопросе.

@Echo Off
SetLocal EnableDelayedExpansion

Rem This Undefines the variables
For %%A In (PACKAGE BRANCH UPDATEFOLDER) Do Set "%%A="

Rem This will propagate the variables
For /F "Tokens=1,5,7 Delims=/" %%A In (
    'More "changed.txt"^|FindStr /I "\/release/.*\.zip$"'
) Do (
    If Defined BRANCH (Set "BRANCH=!BRANCH!,%%A") Else Set "BRANCH=%%A"
    If Defined UPDATEFOLDER (Set "UPDATEFOLDER=!UPDATEFOLDER!,%%B") Else Set "UPDATEFOLDER=%%B"
    If Defined PACKAGE (Set "PACKAGE=!PACKAGE!,%%C") Else Set "PACKAGE=%%C"
)

Rem This will show the variables with their content
Echo PACKAGE is %PACKAGE%
Echo BRANCH is %BRANCH%
Echo UPDATEFOLDER is %UPDATEFOLDER%

Pause

[Edit2 /]
Вот небольшая модификация, позволяющая сначала сохранить команду в переменной, из-за комментария .

@Echo Off
SetLocal EnableDelayedExpansion

Rem This Undefines the variables
For %%A In (PACKAGE BRANCH UPDATEFOLDER) Do Set "%%A="

Rem This will propagate the variables
Set "a=More "changed.txt"|FindStr /I "\/release/.*\.zip$""
For /F "Tokens=1,5,7 Delims=/" %%A In ('"%a%"') Do (
    If Defined BRANCH (Set "BRANCH=!BRANCH!,%%A") Else Set "BRANCH=%%A"
    If Defined UPDATEFOLDER (Set "UPDATEFOLDER=!UPDATEFOLDER!,%%B") Else Set "UPDATEFOLDER=%%B"
    If Defined PACKAGE (Set "PACKAGE=!PACKAGE!,%%C") Else Set "PACKAGE=%%C"
)

Rem This will show the variables with their content
Echo PACKAGE is %PACKAGE%
Echo BRANCH is %BRANCH%
Echo UPDATEFOLDER is %UPDATEFOLDER%

Pause
...