在使用的MSBuild一个的ItemGroup创建文件夹列表(Creating a list of

2019-09-03 12:10发布

我试图建立在含有正下方给定的“根”文件夹中的文件夹列表一个MSBuild脚本中的ItemGroup。 所以 - 在这个例子中...

+ Root folder
---- Sub Folder 1
-------- Sub-Sub Folder 1
-------- Sub-Sub Folder 2
---- Sub Folder 2
---- Sub Folder 3

......我想我的ItemGroup含有“子文件夹1”,“子文件2”和“子文件3”。

有可能是在层次结构的任何点数量的文件,但我只在文件夹感兴趣。

任何人都可以帮助!

Answer 1:

<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)或3.5的msbuild:

<Target Name="foo">
   <ItemGroup>
      <UniqueDirs Include="%(AllFiles.Directory)"/>
   </ItemGroup>
</Target>


Answer 2:

在MSBuild的4.0,这是可能的:

<ItemGroup>
  <Folders Include="$([System.IO.Directory]::GetDirectories(&quot;$(RootFolder)&quot;))" />
</ItemGroup>

物业功能: http://msdn.microsoft.com/en-us/library/dd633440.aspx



Answer 3:

该MSBuild扩展包有一个叫任务FindUnder ,返回文件或文件夹低于某一路径的的ItemGroup。 下面的任务将实现你想要什么,返回包含子文件1,子文件2,子文件3中的ItemGroup,但并非次次文件夹1或分次文件夹2:

<MSBuild.ExtensionPack.FileSystem.FindUnder
    TaskAction="FindDirectories"
    Path="$(RootFolder)"
    Recursive="False">
    <Output ItemName="FoundFolders" TaskParameter="FoundItems" />
</MSBuild.ExtensionPack.FileSystem.FindUnder>


Answer 4:

MSBuild的4.0:

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


Answer 5:

这MSDN论坛发帖具有与空目录的情况下涉及一个自定义任务(upvoted接受其AV有用的答案)



文章来源: Creating a list of Folders in an ItemGroup using MSBuild
标签: msbuild