2012-04-30 56 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