2009-11-01 14 views
27

Próbuję utworzyć grupę ItemGroup w skrypcie MSBuild, który zawiera listę folderów bezpośrednio pod danym folderem "Root". Tak - w tym przykładzie ...Tworzenie listy folderów w grupie Item przy użyciu MSBuild

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

... Chciałbym, żeby mój ItemGroup zawierać podkatalogu "1", "Sub Folder 2" i "3" Sub Folder.

W dowolnym punkcie hierarchii może znajdować się wiele plików, ale interesują mnie tylko foldery.

Czy ktoś może pomóc !?

Odpowiedz

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

@ (OnlyDirs) może zawierać duplikatów, więc można albo użyć RemoveDuplicatesTask:

<Target Name="foo"> 
    <RemoveDuplicates Inputs="@(OnlyDirs)"> 
     <Output TaskParameter="Filtered" ItemName="UniqueDirs"/> 
    </RemoveDuplicates> 
</Target> 

lub użyj CreateItem z dozujący dla% (AllFiles.Identity) lub z msbuild 3.5:

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

To jest naprawdę powolne. Jeśli to możliwe, użyj rozwiązania dostarczonego przez @Stason Stangroome – LuckyLikey

3

This MSDN Forum post ma niestandardowe zadanie, które zajmuje się pustym katalogiem (upvoted przyjęty jako jego użyteczna odpowiedź)

6

Urządzenie MSBuild Extension pack ma zadanie o nazwie FindUnder, które zwraca grupę przedmiotów lub folderów pod określoną ścieżką. Poniższy zadaniem będzie osiągnąć to, co chcesz, zwrócenie ItemGroup zawierający podkatalogu 1, podkatalogu 2 i podkatalogu 3, ale nie Sub-Sub Folder 1 lub Sub-Sub Folder 2:

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

W MSBuild 4.0 jest to możliwe:

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

Funkcje obiektu: http://msdn.microsoft.com/en-us/library/dd633440.aspx

+2

Dzięki! W moim przypadku, dodałem wzorzec wyszukiwania, a także: \t \t Houman

+3

Zamiast brzydkich '"' podmiotów, które dają mi bóle głowy podczas próby odczytania oświadczenia, można również po prostu użyć wycofania ('\' '). – MarioDS

6

MSBuild 4.0:

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

Nie wybiera pustych katalogów. – Mrchief

+0

Powoduje to wybranie folderów podrzędnych, jeśli mają w nich foldery. Tak więc może działać, ale nie gwarantuje, że wybrane zostaną tylko podfoldery pierwszego poziomu. – htuomola

Powiązane problemy