2013-08-21 4 views
1

그래서 MSBuild에서 유틸리티를 실행하는 EXEC 작업이 있습니다. 이 유틸리티는 로그 파일을 작성하지만 stdout에 출력을 생성하지 않습니다.MSBuild 오류 작업, 파일에서 행 읽기 및 로깅 목적을위한 사용자 지정 메시지

오류 (유틸리티가 0 이외의 ReturnCode를 반환 함)의 경우 로그 파일의 내용을 잡고 내용을 기준으로 메시지를 출력하고 싶습니다.

문제는 로그 파일이 크고 그 중 일부만 관심이 있다는 것입니다. 빌드 로그 오류 알림에 포함시키기 위해 작은 부분을 추출하는 방법을 알아낼 수 없습니다. 그러나 무엇이 잘못되었는지 이해하는 것이 중요합니다.

파일 형식 오류의 경우,이 같은 것입니다 :

Line1 
Line2 
Line3 
*** Something Bad Happened 
Details on something bad 
*** Run Failed 
LineX 
LineY 
LineZ 

그래서 난 그냥 세 개의 별표 (*)로 시작하는 첫 번째 줄부터 시작하여 선을 추출하는 방법이있다 필요, 포함 된 세 개의 별표로 시작하는 다음 줄로 계속됩니다. 3 개의 별표로 시작하는 줄이 두 줄 이상인 경우에 대해서는 걱정할 필요가 없습니다.

원격으로도 가능합니까? 그렇다면 나는 마법 주문을 이해할 수 없다. 나는 별표 3 개를 가지고 첫 번째 줄을 잡아서 (단시간에) 정착하고 기꺼이 로그인 할 수 있지만 줄의 전체 블록을 얻고 싶습니다.

+0

3 개의 별표에서 모든 줄을 파일 끝까지 가져 오는 방법도 허용됩니다. 나는 아직도 이것을 이해할 수 없다. 필자는 빌드 로그에 빌드의 일부로 실행되는 유틸리티의 로그 파일을 조금 포함하려고 시도하고 있으므로 너무 많은 파기없이 오류를 진단하는 것이 더 쉽습니다. – pmbAustin

답변

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> 
+0

고마워, 나는 이것을 시험해보고 어떻게되는지 알려줄거야! – pmbAustin