3

svnリポジトリのコミット後フックを準備しようとしています。したがって、コマンドで取得した最後のコミットからのログメッセージが必要svnlook log -r %REV% %REPOS%です。スニペットに適切なパラメータを入力すると、次のマルチラインログメッセージが表示されます。

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ファイルに送信する必要があります。

スクリプトを次のように変更しました(@thxPA)。

@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.で終わりですが、改行はなくなりましたが、さらに処理する必要があります。

4

3 に答える 3

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!
于 2012-04-30T10:09:59.550 に答える
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!
于 2012-04-30T11:04:04.217 に答える
0

delimsがないと、いくつかの単語が欠落します

これが私のpre-commitスクリプトで、書き終えたばかりです。

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
于 2012-05-04T21:24:25.203 に答える