所以我在MSBuild中有一个运行实用程序的EXEC任务。此实用程序会写入日志文件,但不会在stdout上生成输出。
如果出现错误(该实用程序返回一个非0的ReturnCode),我想获取日志文件的内容并根据内容输出一条消息。
问题是日志文件很大,我只对它的一小部分感兴趣。我无法弄清楚如何提取这个小部分以包含在构建日志错误通知中。然而,重要的是让人们了解出了什么问题,而不仅仅是出了问题。
如果出现错误,文件格式是这样的:
Line1
Line2
Line3
*** Something Bad Happened
Details on something bad
*** Run Failed
LineX
LineY
LineZ
所以我需要的是一种只提取线条的方法,从以三个星号开头的第一行开始,继续到以三个星号(INCLUSIVE)开头的下一行。我不需要担心有两行以三个星号开头的情况,因为这种情况从未发生过。
这甚至可以远程实现吗?如果是这样的话,我无法弄清楚这种神奇的咒语。我愿意(短期内)只用三个星号来抓住第一行,然后能够记录下来,但我真的很想得到整条线。
答案 0 :(得分:1)
<Target Name="LogError" Condition="$(ExitCode) != 0">
<PropertyGroup>
<ErrorFile>foo.log</ErrorFile>
<ErrorRead>$([System.IO.File]::ReadAllText($(ErrorFile)))</ErrorRead>
<ErrorText>$([System.Text.RegularExpressions.Regex]::Match($(ErrorRead), '^\*\*\* [\s\S]*^\*\*\* .*', System.Text.RegularExpressions.RegexOptions.Multiline))</ErrorText>
</PropertyGroup>
<Error File="$(ErrorFile)" Text="$(ErrorText)" />
</Target>