2009-11-01 5 views
27

Estoy tratando de crear un ItemGroup en un script de MSBuild que contiene una lista de carpetas directamente debajo de una carpeta 'Root' determinada. Por lo tanto - en este ejemplo ...Crear una lista de carpetas en un grupo de artículos usando MSBuild

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

... Me gustaría que mi ItemGroup para contener "Sub Carpeta 1", "Sub carpeta 2" y "Sub Carpeta 3".

Puede haber una cantidad de archivos en cualquier punto de la jerarquía, pero solo me interesan las carpetas.

¿Alguien puede ayudar?

Respuesta

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

@ (OnlyDirs) podrían contener duplicados, por lo que podría utilizar el RemoveDuplicatesTask:

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

o utilizar CreateItem con procesamiento por lotes para% (AllFiles.Identity) o con msbuild 3.5:

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

Esto es realmente lento Si es posible, use la solución proporcionada por @Stason Stangroome – LuckyLikey

3

This MSDN Forum post tiene una tarea personalizada que se ocupa del caso de directorio vacío (upvoted aceptado como su respuesta útil)

6

El MSBuild Extension pack tiene una tarea llamada FindUnder, que devuelve un grupo de elementos de archivos o carpetas debajo de una ruta determinada. La siguiente tarea será lograr lo que desea, devolver un ItemGroup que contiene Sub carpeta 1, Sub carpeta 2 y Sub Cuaderno 3, pero no Sub-Sub carpeta 1 o Sub-Sub Carpeta 2:

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

En MSBuild 4.0 esto es posible:

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

Funciones de propiedad: http://msdn.microsoft.com/en-us/library/dd633440.aspx

+2

¡Gracias! En mi caso, he añadido el patrón de búsqueda, así: \t \t Houman

+3

En lugar de las feos '"' entidades que me dan dolores de cabeza cuando intento leer la declaración, simplemente podría usar los backticks ('\' ') también. – MarioDS

6

MSBuild 4.0:

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

No selecciona directorios vacíos. – Mrchief

+0

Esto seleccionaría carpetas sub-sub si tienen carpetas en ellas. Así que podría funcionar, pero no garantiza que solo se seleccionen las subcarpetas de primer nivel. – htuomola

Cuestiones relacionadas