2012-04-30 78 views
3

我嘗試爲我的svn存儲庫準備一個post-commit掛鉤。因此,我需要使用命令svnlook log -r %REV% %REPOS%從上次提交的日誌消息。用相應的參數填充片段我得到以下多行日誌消息:通過Windows批處理從svn​​look獲取日誌消息

This 
is 
my 
transaction. 

這個工作到目前爲止效果很好。現在我把這個.bat文件:

@ECHO OFF 

REM just for testing purpose... 
SET REPOS=C:\repo 
SET REV=40 

FOR /F %%i in ('svnlook log -r %REV% %REPOS%') do SET VAR=%%i 

ECHO %VAR% 

當我執行該腳本只有最後一行transaction.迴盪。 for循環是我認爲的一個片段,它會將svnlook輸出讀入%var%

我的方法是將日誌消息放入一個變量中,然後傳遞給另一個exe文件作爲參數。但它不會工作。我不知道如何正確使用循環。

日誌消息應該給另一個exe文件作爲參數。

我修改劇本以下(@thx PA)

@ECHO OFF 
setlocal enabledelayedexpansion 

SET REPOS=C:\repo 
SET REV=40 

SET MSG= 
FOR /F %%i in ('svnlook log -r %REV% %REPOS%') do SET VAR=!VAR! %%i 
ECHO !VAR! 

輸出現在是This is my transaction.但斷行都走了,但我需要作進一步處理。

回答

1

正如你也想的換行符,你可以串接線時添加。

@ECHO OFF 
setlocal enabledelayedexpansion 
set LF=^ 


rem ** The two empty lines are NECESSARY 

SET REPOS=C:\Users\CH.ROSESOFT\Downloads\t3\repo 
SET REV=40 

SET MSG= 
FOR /F %%i in ('svnlook log -r %REV% %REPOS%') do (
    SET "VAR=!VAR!!LF!%%i" 
    SET "PAR=!PAR!^^!LF!!LF!%%i" 
) 
ECHO !VAR! 
myProgram.exe !par! 
+0

這很好,謝謝。但有沒有辦法將這個多行變量作爲參數傳遞給我的exe文件? – Cornertrap

+0

@Cornertrap - 是的,不,也許......這有點棘手,但可能。我將編輯我的帖子 – jeb

+0

謝謝,這解決了問題! – Cornertrap

1

如果我正確理解你的問題,你需要將svnlook的命令的輸出連接成一個變量(像VAR = VAR & %% I)

在BAT您可以通過訪問一個變量的內容編寫包含%標誌的變量。而你通過將它們粘在一起而連接起來。 SET X=%A%SET Y=%A%%B%。所以在你的情況下,你應該將SET賦值改爲SET VAR=%VAR% %%i之類的東西。

但是,這是行不通的。由於作業在FOR循環內,因此需要在每次迭代中重新評估它。您需要啓用延遲擴展。閱讀HELP SET瞭解更多信息。

事情與此類似,

@ECHO OFF 
setlocal enabledelayedexpansion 
... 
SET VAR= 
FOR /F %%i in ('solook log -r %REV% %REPOS%') do SET VAR=!VAR! %%i 
ECHO !VAR! 
+0

Thx到目前爲止。我用更新後的代碼段擴展了我的問題。 – Cornertrap

+0

抱歉,我現在不明白你的問題。您需要在VAR中設置什麼輸出? –

+0

VAR應該是當前svn提交的日誌消息。該消息很可能是用戶寫入多行的消息。後來我想將VAR作爲參數傳遞給exe。 – Cornertrap

0

沒有delims,有些話會缺少

這裏是我的預提交腳本,我剛寫完

如果你設置調試爲1,那麼將啓動失敗所有的時間,你會看到帶有一些var輸出的消息

@echo off 

set DEBUG=0 

:::::::::::::::::::::::::: Dont touch this part ::::::::::::: 
setlocal enabledelayedexpansion 
set space= 
set LF=^ 


rem ** The two empty lines are NECESSARY 
:::::::::::::::::::::::::: Dont touch above  ::::::::::::: 

set REPOS=%1 
set TXN=%2 

::: Get the author :::::::::::::::::::::::::::::::::: 
set author= 
For /F %%I in ('svnlook author %REPOS% -t %TXN%') Do Set author=!author!%%I 

::: Get the message :::::::::::::::::::::::::::::::::: 
set message= 
For /F "delims=" %%I in ('svnlook log %1 -t %2') Do Set message=!message!%%I%space% 


:: Make sure that author is not blank or guest - if readonly accounts are enabled and something goes wrong 
    echo %author% | FindStr [a-zA-Z0-9] >nul 
    IF %ERRORLEVEL% NEQ 0 GOTO AUTHOR_NOT_OK 

    echo %author% | FindStr \C:guest >nul 
    IF %ERRORLEVEL% EQU 0 GOTO AUTHOR_NOT_OK 
    :: %ERRORLEVEL% = 1 at this point means its no error! 

    :: Make sure that the log message contains some text. 
    echo "%message%" | FindStr [a-zA-Z0-9] >nul 
    IF %ERRORLEVEL% NEQ 0 GOTO COMMENT_NOT_OK 

    :: Make sure that the log message contains ACR 
    echo "%message%" | FindStr /I /C:acr >nul 
    IF %ERRORLEVEL% NEQ 0 GOTO COMMENT_NOT_OK 

    GOTO OK 

:COMMENT_NOT_OK 
    echo COMMENT_NOT_OK 1>&2 
    echo "D:\SYSAPPS\HATS\ci\repositories\repo\java\hooks\pre-commit.bat 1>&2 
    echo Your commit has been blocked because you didn't provide adequate log message 1>&2 
    echo Please write a log message describing the purpose of your changes and 1>&2 
    echo then try committing again. -- Thank you 1>&2 
    echo e.g. 1>&2 
    echo ACR: 12345 1>&2 
    echo fixed blah blah blah 1>&2 
    if %DEBUG% EQU 1 GOTO EXITDEBUG 

    exit 1 

:AUTHOR_NOT_OK 
    echo AUTHOR_NOT_OK 1>&2 

:OK 
    if %DEBUG% EQU 1 GOTO EXITDEBUG 
    exit 0 

:EXITDEBUG 

    echo == EXITDEBUG == 1>&2 
    echo ---- %AUTHOR% %message% ---- 1>&2 
    echo txn %TXN% repos %REPOS% 1>&2 
    echo changedpath 1>&2 
    svnlook changed %REPOS% -t %TXN% 1>&2 
    echo ERRORLEVEL %ERRORLEVEL% 1>&2 
    echo "D:\SYSAPPS\HATS\ci\repositories\repo\java\hooks\pre-commit.bat" 1>&2 
    exit 1