Создание списка папок в ItemGroup с помощью MSBuild - PullRequest
32 голосов
/ 01 ноября 2009

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

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

... Я бы хотел, чтобы моя группа товаров содержала «Подпапка 1», «Подпапка 2» и «Подпапка 3».

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

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

Ответы [ 5 ]

50 голосов
/ 20 июля 2011

В MSBuild 4.0 это возможно:

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

Функции недвижимости: http://msdn.microsoft.com/en-us/library/dd633440.aspx

29 голосов
/ 02 ноября 2009
<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>
6 голосов
/ 10 июля 2012

MSBuild 4.0:

<PropertyGroup>
     <RootFolder>tmp</RootFolder>
</PropertyGroup>
<ItemGroup>
    <AllFiles Include="$(RootFolder)\**\*"/>
    <OnlyDirs Include="@(AllFiles->'%(RootDir)%(Directory)'->Distinct())"/>
</ItemGroup>
6 голосов
/ 17 августа 2010

В пакете расширений 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>
3 голосов
/ 22 июля 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...