2009-11-01 10 views
27

Sto provando a creare un gruppo oggetti in uno script MSBuild che contiene un elenco di cartelle direttamente sotto una determinata cartella "di root". Così - in questo esempio ...Creazione di un elenco di cartelle in un gruppo oggetto utilizzando MSBuild

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

... Vorrei che il mio ItemGroup per contenere "sottocartella 1", "Sub Folder 2" e "Cartella sub 3".

Ci può essere un numero di file in qualsiasi punto della gerarchia, ma sono interessato solo alle cartelle.

Qualcuno può aiutare !?

risposta

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

@ (OnlyDirs) potrebbero contenere duplicati, così si potrebbe utilizzare il RemoveDuplicatesTask:

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

o utilizzare CreateItem con dosaggio per il% (AllFiles.Identity) oppure con msbuild 3.5:

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

Questo è veramente lento. Se possibile, utilizzare la soluzione fornita da @Stason Stangroome – LuckyLikey

3

This MSDN Forum post ha un'attività personalizzata che si occupa del caso della directory vuota (upvoted accettato come risposta utile)

6

Il MSBuild Extension pack ha un'attività denominata FindUnder, che restituisce un gruppo di elementi di file o cartelle sotto un determinato percorso. Il compito successivo sarà ottenere quello che vuoi, la restituzione di un ItemGroup contenente sottocartella 1, Sub Folder 2, e sottocartella 3, ma Cartella 1 o sub-sub cartella non sub-sub 2:

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

In MSBuild 4.0 questo è possibile:

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

Funzioni di proprietà: http://msdn.microsoft.com/en-us/library/dd633440.aspx

+2

Grazie! Nel mio caso, ho aggiunto il modello di ricerca così: \t \t Houman

+3

Invece delle brutte '"' entità che mi danno mal di testa quando provo a leggere la dichiarazione, si potrebbe semplicemente usare anche i backtick ('\' '). – MarioDS

6

MSBuild 4.0:

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

Non seleziona directory vuote. – Mrchief

+0

Ciò selezionerebbe le sotto-sotto cartelle se hanno delle cartelle al loro interno. Potrebbe funzionare, ma non garantisce che vengano selezionate solo le sottocartelle di primo livello. – htuomola

Problemi correlati