I'm trying to build an ItemGroup in an MSBuild script which contains a list of folders directly below a given 'Root' folder. So - in this example...
+ Root folde开发者_StackOverflow中文版r
---- Sub Folder 1
-------- Sub-Sub Folder 1
-------- Sub-Sub Folder 2
---- Sub Folder 2
---- Sub Folder 3
... I would want my ItemGroup to contain "Sub Folder 1", "Sub Folder 2" and "Sub Folder 3".
There may be a number of files at any point in the hierarchy, but I'm only interested in the folders.
Can anyone help!?
In MSBuild 4.0 this is possible:
<ItemGroup>
<Folders Include="$([System.IO.Directory]::GetDirectories("$(RootFolder)"))" />
</ItemGroup>
Property Functions: http://msdn.microsoft.com/en-us/library/dd633440.aspx
<PropertyGroup>
<RootFolder>tmp</RootFolder>
</PropertyGroup>
<ItemGroup>
<AllFiles Include="$(RootFolder)\**\*"/>
<OnlyDirs Include="@(AllFiles->'%(Directory)')"/>
</ItemGroup>
@(OnlyDirs) might contain duplicates, so you could either use the RemoveDuplicatesTask :
<Target Name="foo">
<RemoveDuplicates Inputs="@(OnlyDirs)">
<Output TaskParameter="Filtered" ItemName="UniqueDirs"/>
</RemoveDuplicates>
</Target>
or use CreateItem with batching for %(AllFiles.Identity) or with msbuild 3.5:
<Target Name="foo">
<ItemGroup>
<UniqueDirs Include="%(AllFiles.Directory)"/>
</ItemGroup>
</Target>
MSBuild 4.0:
<PropertyGroup>
<RootFolder>tmp</RootFolder>
</PropertyGroup>
<ItemGroup>
<AllFiles Include="$(RootFolder)\**\*"/>
<OnlyDirs Include="@(AllFiles->'%(RootDir)%(Directory)'->Distinct())"/>
</ItemGroup>
The MSBuild Extension pack has a task called FindUnder
, which returns an itemgroup of files or folders below a certain path. The following task will achieve what you want, returning an itemgroup containing Sub Folder 1, Sub Folder 2, and Sub Folder 3, but not Sub-Sub Folder 1 or Sub-Sub Folder 2:
<MSBuild.ExtensionPack.FileSystem.FindUnder
TaskAction="FindDirectories"
Path="$(RootFolder)"
Recursive="False">
<Output ItemName="FoundFolders" TaskParameter="FoundItems" />
</MSBuild.ExtensionPack.FileSystem.FindUnder>
This MSDN Forum post has a custom task that deals with the empty directory case (upvoted accepted as its a v useful answer)
精彩评论