tags:

views:

82

answers:

3

How to search for files containing a particular text string using MSBuild?

+1  A: 

You can find a "grep" task in the MSBuild Contrib project on CodePlex. Haven't used it myself though.

roufamatic
+1  A: 

It's not clear whether you want to search of the text in the name or in the file itself.

If you simply want a list of files that their name match particular (simple) criteria I would suggest using the ItemGroup like this:

The Grep taks from the MSBuild Contrib project would look like this

<PropertyGroup>
  <MSBuildContribCommonTasksAssembly>$(MSBuildExtensionsPath)\MSBuildContrib\MSBuildContrib.Tasks.dll</MSBuildContribCommonTasksAssembly>
</PropertyGroup>

<UsingTask TaskName="MSBuildContrib.Tasks.Grep" AssemblyFile="$(MSBuildContribCommonTasksAssembly)" Condition="Exists('$(MSBuildContribCommonTasksAssembly)')" />

<ItemGroup>
   <FilesToSearch Include="**\*.cs" />
</ItemGroup>

<!-- very simple search -->
<Grep InputFiles="@(FilesToSearch )" OutputFile="out.xml" Pattern="Error" />

<!-- slightly more complicated search (search and extract info) -->
<Grep InputFiles="@(FilesToSearch )" 
  OutputFile="out.xml" 
  Pattern="// (?'Type'TODO|UNDONE|HACK): (\[(?'Author'\w*),(?'Date'.*)\])? (?'Text'[^\n\r]*)"  />

The Grep task will generate the out.xml file that can subsequently be used to read information from it and use in the build process.

mfloryan
A: 

Thanks guys! I appreciate all of your quick replies! I've try Grep but I need to read the xml file to see the result.

I've just found out that we can use the task FilterByContent in MSBuild Extension Pack which gives us a direct result in properties & items. I'd like to share it back to you in case you may need it. An example of usage is as below:

<Target Name="ttt">
  <ItemGroup>
    <files Include="d:\temp\test\**" />
  </ItemGroup>
  <MSBuild.ExtensionPack.FileSystem.File TaskAction="FilterByContent" RegexPattern="abbcc" Files="@(files)" >
    <Output TaskParameter="IncludedFileCount" PropertyName="out"/>
  </MSBuild.ExtensionPack.FileSystem.File>
  <Message Text="ttt:$(out)" />
</Target>

Nam.

Nam Gi VU