I\'m trying to use MSBuild to read in a list of files from a text file, and then perform a recursive copy, copying the contents of those directories files to some staging ar
You have to specify the Exclude
in absolute path and change the exclude wildcard to include subdirectory
If you use an absolute path for Include
, you must use an absolute path for Exclude
. If you use a relative path for Include
, you must use a relative path for both.
<PropertyGroup>
<RootFolder>c:\temp</RootFolder>
<ExcludeFilter>**\*.tmp</ExcludeFilter>
<StagingDirectory>staging</StagingDirectory>
</PropertyGroup>
<ItemGroup>
<InputFile Include="MyFile.txt" />
</ItemGroup>
<Target Name="Build">
<ReadLinesFromFile File="@(InputFile)">
<Output ItemName="AllFolders" TaskParameter="Lines" />
</ReadLinesFromFile>
<CreateItem Include="$(RootFolder)\%(AllFolders.RelativeDir)**"
Exclude="$(RootFolder)\%(AllFolders.RelativeDir)$(ExcludeFilter)">
<Output ItemName="AllFiles" TaskParameter="Include" />
</CreateItem>
<Copy SourceFiles="@(AllFiles)"
DestinationFolder="$(StagingDirectory)\%(RecursiveDir)"/>
</Target>
If you want to exclude multiple items, there is no clean way when you are using absolute path, but you could do with Remove
.
<PropertyGroup>
<RootFolder>c:\temp</RootFolder>
</PropertyGroup>
<ItemGroup>
<InputFile Include="MyFile.txt" />
<!-- Exclude are defined here -->
<ExcludeFilters Include="$(RootFolder)\**\*.tmp"/>
<ExcludeFilters Include="$(RootFolder)\**\*.bmp"/>
</ItemGroup>
<Target Name="Build">
<ReadLinesFromFile File="@(InputFile)">
<Output ItemName="AllFolders" TaskParameter="Lines" />
</ReadLinesFromFile>
<CreateItem Include="$(RootFolder)\%(AllFolders.RelativeDir)**">
<Output ItemName="AllFiles" TaskParameter="Include" />
</CreateItem>
<!-- Removing the wrong extension in item -->
<ItemGroup>
<AllFiles Remove="@(ExcludeFilters)"/>
</ItemGroup>
<Copy SourceFiles="@(AllFiles)"
DestinationFolder="$(StagingDirectory)\%(RecursiveDir)"/>
</Target>
<Target Name="Build">
<ReadLinesFromFile File="@(InputFile)">
<Output ItemName="AllFolders" TaskParameter="Lines" />
</ReadLinesFromFile>
<CreateItem Include="$(RootFolder)\%(AllFolders.RelativeDir)**">
<Output ItemName="AllFiles" TaskParameter="Include" />
</CreateItem>
<!-- Removing the wrong extension in item -->
<ItemGroup>
<AllFiles Remove="@(AllFiles)" Condition="'%(Extension)' == '.tmp'"/>
<AllFiles Remove="@(AllFiles)" Condition="'%(Extension)' == '.bmp'"/>
</ItemGroup>
<Copy SourceFiles="@(AllFiles)"
DestinationFolder="$(StagingDirectory)\%(RecursiveDir)"/>
</Target>