msbuild - varios - renombrar archivos masivamente cmd
Crear una lista de carpetas en un grupo de artÃculos usando MSBuild (5)
Estoy intentando crear un ItemGroup en un script de MSBuild que contiene una lista de carpetas directamente debajo de una carpeta ''Root'' dada. Entonces, en este ejemplo ...
+ 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 contenga "Sub Folder 1", "Sub Folder 2" y "Sub Folder 3".
Puede haber una cantidad de archivos en cualquier punto de la jerarquía, pero solo me interesan las carpetas.
¿¡Alguien puede ayudar!?
El paquete de extensión MSBuild tiene una tarea llamada FindUnder
, que devuelve un grupo de elementos de archivos o carpetas debajo de una determinada ruta. La siguiente tarea logrará lo que desea, devolviendo un grupo de elementos que contiene Subcarpeta 1, Subcarpeta 2 y Subcarpeta 3, pero no Subcarpeta 1 o Subcarpeta 2:
<MSBuild.ExtensionPack.FileSystem.FindUnder
TaskAction="FindDirectories"
Path="$(RootFolder)"
Recursive="False">
<Output ItemName="FoundFolders" TaskParameter="FoundItems" />
</MSBuild.ExtensionPack.FileSystem.FindUnder>
En MSBuild 4.0 esto es posible:
<ItemGroup>
<Folders Include="$([System.IO.Directory]::GetDirectories("$(RootFolder)"))" />
</ItemGroup>
Funciones de propiedad: http://msdn.microsoft.com/en-us/library/dd633440.aspx
MSBuild 4.0:
<PropertyGroup>
<RootFolder>tmp</RootFolder>
</PropertyGroup>
<ItemGroup>
<AllFiles Include="$(RootFolder)/**/*"/>
<OnlyDirs Include="@(AllFiles->''%(RootDir)%(Directory)''->Distinct())"/>
</ItemGroup>
Esta publicación de MSDN Forum tiene una tarea personalizada que trata con el caso de directorio vacío (upvoted aceptado como su respuesta útil)
<PropertyGroup>
<RootFolder>tmp</RootFolder>
</PropertyGroup>
<ItemGroup>
<AllFiles Include="$(RootFolder)/**/*"/>
<OnlyDirs Include="@(AllFiles->''%(Directory)'')"/>
</ItemGroup>
@ (OnlyDirs) puede contener duplicados, por lo que puede usar RemoveDuplicatesTask:
<Target Name="foo">
<RemoveDuplicates Inputs="@(OnlyDirs)">
<Output TaskParameter="Filtered" ItemName="UniqueDirs"/>
</RemoveDuplicates>
</Target>
o use CreateItem con lotes para% (AllFiles.Identity) o con msbuild 3.5:
<Target Name="foo">
<ItemGroup>
<UniqueDirs Include="%(AllFiles.Directory)"/>
</ItemGroup>
</Target>