使用MSBuild在ItemGroup中创建文件夹列表

Chr*_*rts 32 msbuild

我正在尝试在MSBuild脚本中构建一个ItemGroup,该脚本包含直接位于给定"Root"文件夹下的文件夹列表.所以 - 在这个例子中......

+ Root folder
---- Sub Folder 1
-------- Sub-Sub Folder 1
-------- Sub-Sub Folder 2
---- Sub Folder 2
---- Sub Folder 3
Run Code Online (Sandbox Code Playgroud)

...我希望我的ItemGroup包含"子文件夹1","子文件夹2"和"子文件夹3".

层次结构中的任何位置都可能有许多文件,但我只对文件夹感兴趣.

任何人都可以帮忙!?

Jas*_*ome 50

在MSBuild 4.0中,这是可能的:

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

属性函数:http://msdn.microsoft.com/en-us/library/dd633440.aspx

  • 而不是在试图阅读声明时让我头疼的丑陋```实体,你也可以简单地使用反引号(`\``). (6认同)
  • 谢谢!在我的例子中,我也添加了搜索模式:<Folders Include ="$([System.IO.Directory] ​​:: GetDirectories(&quot; $(RootFolder)&quot;,&quot;*$(SearchPattern)*&quot;) )"/> (2认同)

rad*_*cal 29

<PropertyGroup>
    <RootFolder>tmp</RootFolder>
</PropertyGroup>
<ItemGroup>
   <AllFiles Include="$(RootFolder)\**\*"/>
   <OnlyDirs Include="@(AllFiles->'%(Directory)')"/>
</ItemGroup>
Run Code Online (Sandbox Code Playgroud)

@(OnlyDirs)可能包含重复项,因此您可以使用RemoveDuplicatesTask:

<Target Name="foo">
   <RemoveDuplicates Inputs="@(OnlyDirs)">
      <Output TaskParameter="Filtered" ItemName="UniqueDirs"/>
   </RemoveDuplicates>
</Target>
Run Code Online (Sandbox Code Playgroud)

或者使用CreateItem批量处理%(AllFiles.Identity)或使用msbuild 3.5:

<Target Name="foo">
   <ItemGroup>
      <UniqueDirs Include="%(AllFiles.Directory)"/>
   </ItemGroup>
</Target>
Run Code Online (Sandbox Code Playgroud)


Dav*_*eny 6

MSBuild扩展包有一个名为任务FindUnder,返回文件或文件夹低于某一路径的的ItemGroup.以下任务将实现您想要的,返回包含子文件夹1,子文件夹2和子文件夹3的项目组,但不包括子文件夹1或子子文件夹2:

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


Sha*_*ghi 6

MSBuild 4.0:

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

  • 不选择空目录. (2认同)