使用MSBuild在项目组中创建文件夹列表

使用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” 在层次结构的任何一点上都可能有许多文件,但我只对文件

我正在尝试在MSBuild脚本中构建一个ItemGroup,该脚本包含一个文件夹列表,直接位于给定的“根”文件夹之下。在这个例子中

+ 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(&quot;$(RootFolder)&quot;))" />
</ItemGroup>

属性函数:

MSBuild 4.0:

<PropertyGroup>
     <RootFolder>tmp</RootFolder>
</PropertyGroup>
<ItemGroup>
    <AllFiles Include="$(RootFolder)\**\*"/>
    <OnlyDirs Include="@(AllFiles->'%(RootDir)%(Directory)'->Distinct())"/>
</ItemGroup>

tmp

不选择空目录。如果子文件夹中有文件夹,则会选择子文件夹。因此可能会起作用,但不能保证只选择第一级子文件夹。谢谢!在我的例子中,我还添加了搜索模式:与其使用难看的
实体来阅读语句,还不如简单地使用反勾号(
`
)。这真的很慢。如果可能的话,使用@Stason Stanfrome提供的解决方案