MSBuild在文件中查找值

时间:2010-06-14 22:07:47

标签: msbuild cruisecontrol.net

所以我用ccnet运行我的任务,我的任务创建文件。读取文件并从msbuild确定其中是否存在某个值的最佳方法是什么?

2 个答案:

答案 0 :(得分:5)

这取决于你的文件。

包含多行的纯文本

如果文件是这样的:

Building XXX
...
BUILD SUCCESSFUL
Total time: 38 seconds
Buildfile: file.

您可以使用ReadLinesFromFile来阅读文件,使用CreateProperty Condition来检查该值。

<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文件

如果文件是Xml,则可以使用XmlPeek中的XmlRead(MSBuild 4)或{{1}}。

答案 1 :(得分:3)

这是我在MSBuild 4中所做的。这是MSBuild的原始grep,没有模式匹配。此MSBuild项目将在包含字符串(STRING_TO_FIND)的文件夹(SOURCE_FOLDER)中查找文件(FILES_TO_FIND)。

解析文件后,会打印出不包含字符串的文件列表(FILES_THAT_DONT_MATCH),以及执行的文件列表(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>