【问题标题】:Getting log message from svnlook via windows batch通过 Windows 批处理从 svnlook 获取日志消息
【发布时间】:2012-05-10 00:40:25
【问题描述】:

我尝试为我的 svn 存储库准备一个提交后挂钩。因此,我需要使用命令svnlook log -r %REV% %REPOS% 获得的上次提交的日志消息。用适当的参数填充 sn-p 我得到以下多行日志消息:

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-loop 是一个我认为的 sn-p,它会将 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. 但是换行符已经消失了,但我需要进一步处理。

【问题讨论】:

    标签: windows batch-file logging multiline svnlook


    【解决方案1】:

    没有分隔符,有些单词会丢失

    这是我的预提交脚本,我刚刚写完

    如果您将 debug 设置为 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
    

    【讨论】:

      【解决方案2】:

      如果您还需要换行符,您可以在连接行时添加它们。

      @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!
      

      【讨论】:

      • 这很好用谢谢。但是有没有办法将此多行变量作为参数传递给我的 exe?
      • @Cornertrap - 是的,不,也许......这有点棘手,但可能。我将编辑我的帖子
      • 非常感谢,今天遇到了同样的事情,浪费了 2 个小时才发现这个挂钩 stackoverflow.com/questions/3839375/…
      【解决方案3】:

      如果我正确理解您的问题,您需要将 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!
      

      【讨论】:

      • 抱歉,我现在不明白你的问题。您需要在 VAR 中设置的输出是什么?
      • VAR 应该是来自当前 svn 提交的日志消息。该消息很可能是用户编写的多行消息。稍后我想将 VAR 作为参数传递给 exe。
      • 所以?在您的测试用例中,VAR 的正确内容是什么?
      • 应该是“这是我的交易”。其中每个都在换行符中。但我认为这里已经解决了。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-06-06
      • 2017-08-11
      • 2014-06-30
      • 2020-10-19
      相关资源
      最近更新 更多