使用MSBuild在项目组中创建文件夹列表
我正在尝试在MSBuild脚本中构建一个ItemGroup,该脚本包含一个文件夹列表,直接位于给定的“根”文件夹之下。在这个例子中使用MSBuild在项目组中创建文件夹列表,msbuild,Msbuild,我正在尝试在MSBuild脚本中构建一个ItemGroup,该脚本包含一个文件夹列表,直接位于给定的“根”文件夹之下。在这个例子中 + Root folder ---- Sub Folder 1 -------- Sub-Sub Folder 1 -------- Sub-Sub Folder 2 ---- Sub Folder 2 ---- Sub Folder 3 。。。我希望我的项目组包含“子文件夹1”、“子文件夹2”和“子文件夹3” 在层次结构的任何一点上都可能有许多文件,但我只对文件
+ Root folder
---- Sub Folder 1
-------- Sub-Sub Folder 1
-------- Sub-Sub Folder 2
---- Sub Folder 2
---- Sub Folder 3
。。。我希望我的项目组包含“子文件夹1”、“子文件夹2”和“子文件夹3”
在层次结构的任何一点上都可能有许多文件,但我只对文件夹感兴趣
有人能帮忙吗
<PropertyGroup>
<RootFolder>tmp</RootFolder>
</PropertyGroup>
<ItemGroup>
<AllFiles Include="$(RootFolder)\**\*"/>
<OnlyDirs Include="@(AllFiles->'%(Directory)')"/>
</ItemGroup>
tmp
@(OnlyDirs)可能包含重复项,因此您可以使用RemovedUpplicateSTASK:
<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>
有一个自定义任务,用于处理空目录的情况(向上投票被认为是一个有用的答案)有一个名为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>
在MSBuild 4.0中,这是可能的:
<ItemGroup>
<Folders Include="$([System.IO.Directory]::GetDirectories("$(RootFolder)"))" />
</ItemGroup>
属性函数:MSBuild 4.0:
<PropertyGroup>
<RootFolder>tmp</RootFolder>
</PropertyGroup>
<ItemGroup>
<AllFiles Include="$(RootFolder)\**\*"/>
<OnlyDirs Include="@(AllFiles->'%(RootDir)%(Directory)'->Distinct())"/>
</ItemGroup>
tmp
不选择空目录。如果子文件夹中有文件夹,则会选择子文件夹。因此可能会起作用,但不能保证只选择第一级子文件夹。谢谢!在我的例子中,我还添加了搜索模式:与其使用难看的“
实体来阅读语句,还不如简单地使用反勾号(`
)。这真的很慢。如果可能的话,使用@Stason Stanfrome提供的解决方案