2009-11-01 32 views
27

'u kullanarak bir ItemGroup içinde bir klasör listesi oluşturma Bir 'belirli bir' kök 'klasörünün hemen altında bir klasör listesi içeren bir MSBuild komut dosyasında ItemGroup oluşturmaya çalışıyorum. Yani - bu örnekte ... MSBuild

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

... benim ItemGroup "Alt Klasör 1", "Alt Klasör 2" ve "Alt Klasör 3" içeren isterim.

Hiyerarşinin herhangi bir noktasında çok sayıda dosya olabilir, ancak yalnızca klasörlerle ilgileniyorum.

Herkes yardımcı olabilir mi? @

cevap

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

Eğer RemoveDuplicatesTask kullanabilir ya da çok (OnlyDirs), çiftleri içerebilir:

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

veya% için istifleme ile (AllFiles.Identity) CreateItem kullanabilir veya msbuild 3.5 ile:

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

Bu gerçekten yavaş. Mümkünse @Stason Stangroome tarafından sağlanan çözümü kullanın – LuckyLikey

3

This MSDN Forum post boş dizin durumuyla ilgilenen özel bir göreve sahiptir (daha sonra gelen AV yanıtı olarak kabul edilir)

6

MSBuild Extension pack, belirli bir yolun altında dosya veya klasörlerin bir öğe grubunu döndüren FindUnder adlı bir göreve sahiptir. Aşağıdaki görev Alt Klasör 1, Alt Klasör 2 ve Alt Klasör 3 içeren bir ItemGroup dönen, İstediğinizi elde fakat Alt Alt değil Klasör 1 veya Alt-Alt Klasör 2 edecektir:

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

MSBuild 4.0'da Bu mümkündür:

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

Mülkiyet Fonksiyonlar: http://msdn.microsoft.com/en-us/library/dd633440.aspx

+2

Teşekkürler! Benim durumumda, ben de arama desen ekledi: \t \t Houman

+3

İfadeyi okumaya çalışırken bana başım ağrıyor olan çirkin '"' varlıklardan ziyade, backticks ('\' ') da kullanabilirsiniz. – MarioDS

6

MSBuild 4.0:

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

Boş dizinler seçilmez. – Mrchief

+0

Bu, alt klasörleri varsa, alt klasörleri seçer. Bu yüzden işe yarayabilir, ancak sadece birinci düzey alt klasörlerin seçildiğini garanti etmez. – htuomola