我试图准备一个post-commit钩子我的svn库。 因此我需要从最后的日志信息提交,我用命令得到svnlook log -r %REV% %REPOS%
充入适当的PARAMS我得到以下multline日志消息的片段:
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.
但断行都走了,但我需要作进一步处理。
正如你也想的换行符,你可以串接线时添加。
@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!
如果我没有理解你的问题,你需要连接的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!
无delims,有些话会丢失
这里是我的预提交脚本,我刚写完
如果你设置调试到1,它将启动失败的时候,你会在这里看到一些无功输出消息
@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