MSBuild найти значение в файле - PullRequest
2 голосов
/ 15 июня 2010

Итак, я запускаю задачу с помощью ccnet, и моя задача создает файлы. Каков наилучший способ прочитать файл и определить, есть ли в нем определенное значение из msbuild ??

Ответы [ 2 ]

5 голосов
/ 15 июня 2010

Это зависит от вашего файла.

Простой текст с несколькими строками

Если файл такой:

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 (MSBuild 4) или XmlRead из Задача сообщества MSBuild .

3 голосов
/ 13 сентября 2011

Вот что я сделал в MSBuild 4. Это грубый, но родной grep для MSBuild, без сопоставления с образцом.Этот проект MSBuild будет искать файлы (FILES_TO_FIND) в папке (SOURCE_FOLDER), которые содержат строку (STRING_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>
...