web-dev-qa-db-ja.com

MSBuildを使用してItemGroup内のフォルダーのリストを作成する

指定された「ルート」フォルダーのすぐ下にあるフォルダーのリストを含む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」を含めたいと思います。

階層の任意の場所に多数のファイルが存在する可能性がありますが、私はフォルダーにのみ関心があります。

誰か助けてもらえますか!?

32
Chris Roberts
<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>

または、%(AllFiles.Identity)のバッチ処理またはmsbuild3.5でCreateItemを使用します。

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

MSBuild 4.0では、これが可能です。

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

プロパティ関数: http://msdn.Microsoft.com/en-us/library/dd633440.aspx

50

MSBuild 4.0:

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

MSBuild拡張パック には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>
6
David Keaveny

このMSDNフォーラムの投稿 空のディレクトリのケースを処理するカスタムタスクがあります(v有用な回答として承認されました)

3
Ruben Bartelink