2012-09-17 37 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