2016-05-21 6 views
1

я пришел с этимSVN Checkout автоматизация партия

echo. 
echo. [ SVN Updater ] 
setlocal enableDelayedExpansion 
set SOURCE=E:\Svncheckout\ 
set SVN=C:\Program Files\TortoiseSVN\bin 
set SVN_REPO_URL=https://SVNSERVERIP/svn/ 
set projects=project1/branches/hello1 project2/branches/hello2 
set checkoutdir=project1 project2 
echo. 
SET PROJCOUNT=0 
(for %%i in (%projects%) do (
    echo. Checking out %SVN_REPO_URL%%%i from SVN... 
    "%SVN%\TortoiseProc.exe" /command:checkout /path:"%SOURCE%%checkoutdir[0]%" /url:"%SVN_REPO_URL%%%i" /closeonend:2 
    PROJCOUNT+=1; 
) 
) 
echo. 
echo. Operation complete. 

Я хотел бы, чтобы перебирать массив checkoutdir списка с каждым именем каталога. Я застрял здесь. Я новичок для пакетного программирования. Просьба помочь

Способ 2:

echo. 
echo. [ SVN Updater ] 
setlocal enableDelayedExpansion 
set SOURCE=E:\Svncheckout\21MAY2016\ 
set SVN=C:\Program Files\TortoiseSVN\bin 
set SVN_REPO_URL=https://192.168.1.35:8443/svn/ 
set projects=JPO/JPOMobile/branches/2016-05-18 JPO/JPOWEB/branches/20160518 
set checkoutdir=JPOMobile JPOWEB 
set /A CHECKOUTCOUNT=1 
set /A PROJCOUNT=0 
(for %%i in (%projects%) do (
     SET /A "PROJCOUNT+=1" 
    (for %%a in (%checkoutdir%) do (
     IF ("%PROJCOUNT%"=="%CHECKOUTCOUNT%") (
      echo. Checking out %SVN_REPO_URL%%%i from SVN... 
      "%SVN%\TortoiseProc.exe" /command:checkout /path:"%SOURCE%%%a" /url:"%SVN_REPO_URL%%%i" /closeonend:2 
      SET /A "CHECKOUTCOUNT+=1" 
     )  

    )) 
)) 
echo. 
echo. Operation complete. 

Во втором методе, его ошибки, установите/A PROJCOUNT = 0 в неожиданное на этом time.I думать, что есть некоторые проблемы в цикле for

+0

Я вижу, что вы знаете 'for %% i in (% projects%) do (rem some code here ...)' подход. Примените его следующим образом: 'for %% G in (% checkoutdir%) do (rem %% i loop here)', но используйте '%% ~ G' вместо'% checkoutdir [0]% '. Нет ничего похожего на _list array_ в пакетном сценарии: есть только _strings_ (или _numbers_ somehen). – JosefZ

+0

@JosefZ Я обновил еще одну попытку. Вы можете мне помочь? – Keerthivasan

+1

Зачем использовать Tortoise GUI? Для желающих вы также можете напрямую использовать командную строку SVN: «% SVN% \ svn.exe» checkout «% SVN_REPO_URL %% ~ 1» "% SOURCE %%% D" – AFract

ответ

2

Вот мое решение для выполнения этой задачи:

@echo off 
echo. 
echo. [ SVN Updater ] 
set "SOURCE=E:\Svncheckout\21MAY2016\" 
set "SVN=%ProgramFiles%\TortoiseSVN\bin" 
set "SVN_REPO_URL=https://192.168.1.35:8443/svn/" 
set "projects=JPO/JPOMobile/branches/2016-05-18 JPO/JPOWEB/branches/20160518" 
set "checkoutdir=JPOMobile JPOWEB" 
set "ProjectCount=0" 
for %%P in (%projects%) do call :CheckOut "%%P" 
echo. 
echo. Operation complete. 

rem Exit batch processing to avoid a fall through to subroutine. 
exit /B 

:CheckOut 
set /A ProjectCount+=1 
for /F "tokens=%ProjectCount%" %%D in ("%checkoutdir%") do (
    echo. Checking out %SVN_REPO_URL%%~1 from SVN... 
    "%SVN%\TortoiseProc.exe" /command:checkout /path:"%SOURCE%%%D" /url:"%SVN_REPO_URL%%~1" /closeonend:2 
) 
rem Exit this subroutine. It is also possible to use GOTO :EOF 
exit /B 

Первые процессы цикла каждого проекта определены в переменной окружения projects, разделенных пробелом. Для каждого проекта подпрограмма CheckOut вызывается с текущим пути проекта в качестве аргумента.

Подпрограмма CheckOut первое приращение количества проектов переменного, которая является каталог Checkout индекса строки с первой строкой, имеющий номер индекса 1.

Второй цикл в этой подпрограмме интерпретирует список каталогов в переменном окружении checkoutdir теперь как string вместо списка строк из-за использования параметра /F из ДЛЯ и включения значения переменной окружения в двойные кавычки.

Чтобы получить N-й каталог выписки из строки с каталогами проверки, разделенными пробелами, используется синтаксис tokens=x, где x - текущее значение переменной счетчика проекта.

Выполнение заказа осуществляется с помощью каталога Nth checkout и текущего проекта, на который ссылается %~1 как переданный подпрограмме в качестве первого аргумента.

Подробнее об использовании подпрограмм и ссылочных параметров запустите в окне командной строки call /? и прочитайте все страницы справки вывода.

Подпрограмма, используемая здесь, похожа на наличие другого пакетного файла, встроенного в текущий пакетный файл.

ПРИМЕЧАНИЕ: Существует ограничение в 31 токен. ProjectCount не должно превышать значение 31.

+0

Отлично, это потрясающе. Благодаря тонну! Я многому научился у него – Keerthivasan

1

1-й: неправильный IF syntax: удалить следующие вредные скобки

IF ("%PROJCOUNT%"=="%CHECKOUTCOUNT%") (
rem ^       ^

второй: variables within parenthesized command blocks:

Задержка расширения вызовет переменные, которые будут расширены в исполнение время, а не во время синтаксического анализа, эта опция включена с SETLOCAL command. Когда действует замедленное расширение, переменные можно использовать с помощью !variable_name! (в дополнение к нормальному %variable_name%).

Вы должны применятьDelayed Expansionгде необходимо как объявление его не хватает.

третьего (косметическая ошибка): удалить ненужные скобки.

Обновленный код: обратите внимание, что команда TortoiseProc.exe является просто ECHOed для целей отладки.

echo off 
echo. 
echo. [ SVN Updater ] 
setlocal EnableExtensions EnableDelayedExpansion 
set SOURCE=E:\Svncheckout\21MAY2016\ 
set SVN=C:\Program Files\TortoiseSVN\bin 
set SVN_REPO_URL=https://192.168.1.35:8443/svn/ 
set projects=JPO/JPOMobile/branches/2016-05-18 JPO/JPOWEB/branches/20160518 
set checkoutdir=JPOMobile JPOWEB 
set /A CHECKOUTCOUNT=1 
set /A PROJCOUNT=0 
for %%i in (%projects%) do (
     SET /A "PROJCOUNT+=1" 
    for %%a in (%checkoutdir%) do (
     rem wrong IF ("%PROJCOUNT%"=="%CHECKOUTCOUNT%") (
     rem right IF "!PROJCOUNT!"=="!CHECKOUTCOUNT!" (
     rem or IF !PROJCOUNT! EQU !CHECKOUTCOUNT! (
     IF !PROJCOUNT! EQU !CHECKOUTCOUNT! (
      echo. Checking out %SVN_REPO_URL%%%i from SVN... 
      ECHO "%SVN%\TortoiseProc.exe" /command:checkout /path:"%SOURCE%%%a" /url:"%SVN_REPO_URL%%%i" /closeonend:2 
      SET /A "CHECKOUTCOUNT+=1" 
     )  

    ) 
) 
echo. 
echo. Operation complete. 
echo. debug  PROJCOUNT=%PROJCOUNT% 
echo.  CHECKOUTCOUNT=%CHECKOUTCOUNT% 
+0

, спасибо за объяснение. Я очень ценю это – Keerthivasan