2

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??

Xander
  • 9,069
  • 14
  • 70
  • 129

2 Answers2

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