指定された「ルート」フォルダーのすぐ下にあるフォルダーのリストを含む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」を含めたいと思います。
階層の任意の場所に多数のファイルが存在する可能性がありますが、私はフォルダーにのみ関心があります。
誰か助けてもらえますか!?
<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>
MSBuild 4.0では、これが可能です。
<ItemGroup>
<Folders Include="$([System.IO.Directory]::GetDirectories("$(RootFolder)"))" />
</ItemGroup>
プロパティ関数: http://msdn.Microsoft.com/en-us/library/dd633440.aspx
MSBuild 4.0:
<PropertyGroup>
<RootFolder>tmp</RootFolder>
</PropertyGroup>
<ItemGroup>
<AllFiles Include="$(RootFolder)\**\*"/>
<OnlyDirs Include="@(AllFiles->'%(RootDir)%(Directory)'->Distinct())"/>
</ItemGroup>
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>
このMSDNフォーラムの投稿 空のディレクトリのケースを処理するカスタムタスクがあります(v有用な回答として承認されました)