我正在尝试在MSBuild脚本中构建一个ItemGroup,该脚本包含直接位于给定“Root”文件夹下的文件夹列表。所以 - 在这个例子中......
+ Root folder
---- Sub Folder 1
-------- Sub-Sub Folder 1
-------- Sub-Sub Folder 2
---- Sub Folder 2
---- Sub Folder 3
...我希望我的ItemGroup包含“Sub Folder 1”,“Sub Folder 2”和“Sub Folder 3”。
层次结构中的任何一点都可能有多个文件,但我只对这些文件夹感兴趣。
任何人都可以帮忙!?
答案 0 :(得分:50)
在MSBuild 4.0中,这是可能的:
<ItemGroup>
<Folders Include="$([System.IO.Directory]::GetDirectories("$(RootFolder)"))" />
</ItemGroup>
答案 1 :(得分:29)
<PropertyGroup>
<RootFolder>tmp</RootFolder>
</PropertyGroup>
<ItemGroup>
<AllFiles Include="$(RootFolder)\**\*"/>
<OnlyDirs Include="@(AllFiles->'%(Directory)')"/>
</ItemGroup>
@(OnlyDirs)可能包含重复项,因此您可以使用RemoveDuplicatesTask:
<Target Name="foo">
<RemoveDuplicates Inputs="@(OnlyDirs)">
<Output TaskParameter="Filtered" ItemName="UniqueDirs"/>
</RemoveDuplicates>
</Target>
或使用CreateItem批量处理%(AllFiles.Identity)或使用msbuild 3.5:
<Target Name="foo">
<ItemGroup>
<UniqueDirs Include="%(AllFiles.Directory)"/>
</ItemGroup>
</Target>
答案 2 :(得分:6)
MSBuild Extension pack有一个名为FindUnder
的任务,它返回某个路径下方的文件或文件夹的项目组。以下任务将实现您想要的,返回包含子文件夹1,子文件夹2和子文件夹3的项目组,但不包括子文件夹1或子子文件夹2:
<MSBuild.ExtensionPack.FileSystem.FindUnder
TaskAction="FindDirectories"
Path="$(RootFolder)"
Recursive="False">
<Output ItemName="FoundFolders" TaskParameter="FoundItems" />
</MSBuild.ExtensionPack.FileSystem.FindUnder>
答案 3 :(得分:6)
MSBuild 4.0:
<PropertyGroup>
<RootFolder>tmp</RootFolder>
</PropertyGroup>
<ItemGroup>
<AllFiles Include="$(RootFolder)\**\*"/>
<OnlyDirs Include="@(AllFiles->'%(RootDir)%(Directory)'->Distinct())"/>
</ItemGroup>
答案 4 :(得分:3)
This MSDN Forum post有一个自定义任务,处理空目录案例(upvoted被认为是一个有用的答案)