Подтвердить что ты не робот

Создание списка папок в группе элементов с помощью MSBuild

Я пытаюсь создать ItemGroup в MSBuild script, который содержит список папок непосредственно под данной папкой "Root". Итак - в этом примере...

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

... Я бы хотел, чтобы моя ItemGroup содержала "Sub Folder 1", "Sub Folder 2" и "Sub Folder 3".

В любой точке иерархии может быть несколько файлов, но меня интересуют только папки.

Может кто-нибудь помочь!?

4b9b3361

Ответ 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) или с помощью msbuild 3.5:

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

Ответ 3

MSBuild Extension pack имеет задачу с именем 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>

Ответ 4

MSBuild 4.0:

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

Ответ 5

Этот пост форума MSDN имеет настраиваемую задачу, которая имеет дело с пустым случаем каталога (рекомендуется использовать его как полезный ответ)