2012-09-17 34 views
1

我有一個批處理文件,它接收包含我要報告給TeamCity的多行註釋(堆棧跟蹤)的輸入參數。下面的代碼適用於單行註釋,並從消息中刪除括號和引號。問題是隻有第一行多行消息被報告。在批處理文件中向TeamCity報告多行註釋

rem Try to remove line breaks (not working) 
setlocal EnableDelayedExpansion 
SET message=%~1 
set ^"message=!message:^ 

= !" 

rem Remove square brackets and quotes 
SET message=%message:[=% 
SET message=%message:]=% 
SET message=%message:'=% 

rem Print message to console for TeamCity 
echo ##teamcity[progressMessage '%message%'] 

有沒有辦法在echo語句之前刪除所有換行符並將它們替換爲空格?

回答

1

你可能不太幸運:雖然可以創建多行變量,但它似乎不可能通過批處理文件中的參數接收它們。

如果是批次間批次調用,可以將多行值存儲在環境變量中並傳遞變量的名稱。

如果您以任何方式控制調用應用程序,您可以考慮在那裏更換新聞線,或者更好的方式是讓它調用除批處理文件之外的其他內容。

另請參閱this SO answer和包含在答案中的link,它更詳細地討論了接收多行參數的問題。

順便說一下,您的代碼換行符的工作正常。

1

我想沒有一個通用的解決方案。
但它可能爲您提供解決方案!

這取決於你的批處理被調用的方式,如果它是通過一個新的cmd實例調用的,你可以使用!cmdcmdline!甚至可以使用換行符和回車符來訪問完整的參數。

@echo off 
setlocal EnableDelayedExpansion 
set "message=!cmdcmdline!" 
for /f %%a in ('copy /Z "%~dpf0" nul') do set "CR=%%a" 
set LF=^ 


REM ** Two empty lines are required 
FOR %%L in ("!LF!") do set "message=!message:%%~L=\n!" 
FOR %%C in ("!CR!") do set "message=!message:%%~C=\r!" 
echo ##teamcity[progressMessage '!message!'] 

您可以invoke.bat

@echo off 
setlocal EnableDelayedExpansion 
set LF=^ 


for /f %%a in ('copy /Z "%~dpf0" nul') do set "CR=%%a" 
cmd /c test one!lf!two!CR!three 
+0

仍然需要刪除命令行invokation測試它(我得到的東西像'##的TeamCity [progressMessage「CMD \ C測試一個\ ntwo \ rthree ']',但這真的很酷!很高興我不必使用它,但:-) +1從我這裏! – marapet

+0

@marapet你說得對,但是這需要一些關於調用名稱的知識。因爲它可以通過'cmd/c test.bat one-two-three'調用,但它也可以是'cmd/c test one-two-three'或者甚至是'cmd/c'/ path/space/test「一個 - 兩個-three'。所以去除頭部並不容易。 – jeb