2009-11-01 21 views
27

का उपयोग कर आइटम समूह में फ़ोल्डरों की एक सूची बनाना, मैं एक MSGuild स्क्रिप्ट में एक आइटम समूह बनाने की कोशिश कर रहा हूं जिसमें किसी दिए गए 'रूट' फ़ोल्डर के नीचे फ़ोल्डर्स की एक सूची शामिल है। तो - इस उदाहरण में ...MSBuild

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

... मैं अपने ItemGroup "उप फ़ोल्डर 1", "उप फ़ोल्डर 2" और "उप फ़ोल्डर 3" को रोकने के लिए चाहते हैं।

पदानुक्रम में किसी भी बिंदु पर कई फाइलें हो सकती हैं, लेकिन मुझे केवल फ़ोल्डरों में दिलचस्पी है।

क्या कोई मदद कर सकता है ??

उत्तर

27
<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> 
+1

यह वास्तव में धीमा है। यदि संभव हो तो @Stason Stangroome – LuckyLikey

3

This MSDN Forum post में एक कस्टम कार्य है जो खाली निर्देशिका मामले से संबंधित है (ऊपर दिए गए अपने उपयोगी उत्तर के रूप में स्वीकृत स्वीकृत)

6

MSBuild Extension pack में FindUnder नामक एक कार्य है, जो किसी निश्चित पथ के नीचे फ़ाइलों या फ़ोल्डरों का एक आइटम समूह देता है। निम्नलिखित कार्य प्राप्त होगा आप क्या चाहते हैं, उप फ़ोल्डर 1, उप फ़ोल्डर 2, और उप फ़ोल्डर 3 युक्त एक itemgroup लौटने, लेकिन नहीं उप-उप फ़ोल्डर 1 या उप-उप फ़ोल्डर 2:

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

MSBuild 4.0 में यह संभव है:

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

संपत्ति कार्य: http://msdn.microsoft.com/en-us/library/dd633440.aspx

+2

द्वारा प्रदान किए गए समाधान का उपयोग करें धन्यवाद! मेरे मामले में, मैं खोज पैटर्न के रूप में अच्छी तरह से कहा: \t \t <फ़ोल्डर शामिल = "$ ([System.IO.Directory] :: GetDirectories (" $ (RootFolder) ", " * $ (SearchPattern) * "))" /> – Houman

+3

बदसूरत '" 'संस्थाओं की बजाय, जो मुझे बयान पढ़ने की कोशिश करते समय सिरदर्द देते हैं, आप बस बैकटिक्स (' \ '') का भी उपयोग कर सकते हैं। – MarioDS

6

MSBuild 4.0:

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

खाली निर्देशिका का चयन नहीं करता है। – Mrchief

+0

यदि वे उनमें फ़ोल्डर्स हैं तो यह सब-सब फ़ोल्डरों का चयन करेगा। तो काम कर सकता है लेकिन यह गारंटी नहीं देता है कि केवल प्रथम स्तर के उपफोल्डर्स का चयन किया जाता है। – htuomola

 संबंधित मुद्दे