So I run my task with ccnet and my task creates files. What is the best way to read the file and identify if there is a certain value in it from msbuild??
Asked
Active
Viewed 2,059 times
2
-
What type of file? Plain text or Xml? – Filburt Jun 15 '10 at 05:36
2 Answers
5
It's depend on your file.
Plain text with multiple lines
If the file is like that :
Building XXX
...
BUILD SUCCESSFUL
Total time: 38 seconds
Buildfile: file.
You could use ReadLinesFromFile
to read the file and CreateProperty
with a Condition
to check the value.
<PropertyGroup>
<ValueToCheck>BUILD SUCCESSFUL</ValueToCheck>
</PropertyGroup>
<Target Name="CheckValue">
<ReadLinesFromFile File="@(MyTextFile)" >
<Output TaskParameter="Lines" ItemName="Value"/>
</ReadLinesFromFile>
<CreateProperty Value="true"
Condition="'%(Value.Identity)' == '$(ValueToCheck)'">
<Output TaskParameter="Value" PropertyName="ValueIsPresent" />
</CreateProperty>
</Target>
Xml file
If the file is in Xml, you could use XmlPeek
(MSBuild 4) or XmlRead
from MSBuild Community Task.

Community
- 1
- 1

Julien Hoarau
- 48,964
- 20
- 128
- 117
3
Here's what I did in MSBuild 4. It's a crude but native grep for MSBuild, with no pattern matching. This MSBuild project will look for files (FILES_TO_FIND) in a folder (SOURCE_FOLDER) that contain a string (STRING_TO_FIND).
After parsing the files, it prints a list of files that do not contain the string (FILES_THAT_DONT_MATCH), and a list of files that did (FILES_THAT_MATCH).
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003"
ToolsVersion="4.0" DefaultTargets="Main">
<!-- Works as-is in MSBuild 4.0.30319.1 -->
<PropertyGroup>
<SOURCE_FOLDER>C:\MyCode</SOURCE_FOLDER>
<FILES_TO_SEARCH>*.sln</FILES_TO_SEARCH>
<STRING_TO_FIND>vcxproj</STRING_TO_FIND>
</PropertyGroup>
<ItemGroup>
<FILES_TO_SEARCH Include="$(SOURCE_FOLDER)\**\$(FILES_TO_SEARCH)"/>
</ItemGroup>
<Target Name="Main" DependsOnTargets="CheckForValue">
<Message Text="$(FILES_TO_SEARCH) files without '$(STRING_TO_FIND)':"
Importance="high"/>
<Message Text=" - %(FILES_THAT_DONT_MATCH.Identity)"/>
<Message Text=" "/>
<Message Text="$(FILES_TO_SEARCH) files with '$(STRING_TO_FIND)':"
Importance="high"/>
<Message Text=" - %(FILES_THAT_MATCH.Identity)"/>
</Target>
<Target Name="CheckForValue" Outputs="%(FILES_TO_SEARCH.Identity)">
<ReadLinesFromFile File="%(FILES_TO_SEARCH.Identity)" >
<Output TaskParameter="Lines" ItemName="LinesFromReadFile"/>
</ReadLinesFromFile>
<PropertyGroup>
<FileContent>@(LinesFromReadFile)</FileContent>
</PropertyGroup>
<ItemGroup>
<FILES_THAT_MATCH Include="%(FILES_TO_SEARCH.Identity)"
Condition="$(FileContent.Contains ('$(STRING_TO_FIND)'))"/>
<FILES_THAT_DONT_MATCH Include="%(FILES_TO_SEARCH.Identity)"
Condition="!$(FileContent.Contains ('$(STRING_TO_FIND)'))"/>
</ItemGroup>
</Target>
</Project>

Steve HHH
- 12,947
- 6
- 68
- 71