2012-06-15 18 views
6

¿Cómo puedo procesar una ruta recursivamente para que una vez que se complete el procesamiento no haya directorios vacíos debajo de la ruta?Eliminar directorios vacíos utilizando msbuild

Por ejemplo, digamos que tenemos C:\Dir1\Dir2\Dir3 y no hay archivos en ninguno de estos directorios. El resultado debería ser la eliminación de los tres directorios.

Me gustaría lograr esto sin el uso de tareas personalizadas.

Respuesta

12

Algo como esto debería funcionar, no comprobar el rendimiento de contar miles de archivos, aunque sólo para obtener longitud de la matriz ...

<Project DefaultTargets="Foo" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> 
    <Target Name="Foo"> 
     <ItemGroup> 
      <Directories Include="$([System.IO.Directory]::GetDirectories('D:\foo', '*', System.IO.SearchOption.AllDirectories))" /> 
      <Directories> 
       <Files>$([System.IO.Directory]::GetFiles("%(Directories.Identity)", "*", System.IO.SearchOption.AllDirectories).get_Length())</Files> 
      </Directories> 
     </ItemGroup>   
     <RemoveDir Directories="@(Directories)" Condition="%(Files)=='0'" /> 
    </Target> 
</Project> 
+0

No creo que esto sea correcto. Un directorio que contiene un directorio que contiene archivos no debe ser eliminado. Consulte el texto preciso sobre recursividad, etc. en la primera línea del OP. –

+0

Un directorio que contiene un directorio que contiene archivos no se eliminará porque el conteo de archivos para dicho directorio con la opción AllDirectories no será 0. –

+0

Ahhh, no estaba prestando atención a la parte 'AllDirectories'. Algo ineficaz para árboles profundamente anidados que contienen muchos archivos en las profundidades del árbol, pero dudo que eso sea un problema en la práctica. Aunque me parece bastante elegante. ¡Gracias! –

3

El uso de un Exec Tarea PowerShell ejecutando:

MSBuild

<Project DefaultTargets="DefaultTarget" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> 
    <PropertyGroup> 
     <CleanPath>C:\MyDirAboveDir1</CleanPath> 
    </PropertyGroup> 

    <Target Name="DefaultTarget"> 
     <Exec Command="PowerShell .\RemoveDir.ps1 '$(CleanPath)'" /> 
    </Target> 
</Project> 

PowerShellRemoveDir.ps1

Param ([string]$folderpath = $(throw "provide folderpath")) 

$folders = Get-ChildItem $folderpath -recurse -force | ? {$_.PSIsContainer} 

if ($folders -ne $null) 
{ 
    [array]::Reverse($folders) 

    foreach($folder in $folders) 
    { 
     Write-Host "Examining contents of $($folder.fullname)" 
     $childitems = Get-Childitem $folder.fullname -recurse -force | ? { $_.PSIsContainer -eq $false } 

     if($childitems -eq $null) 
     { 
      "Remove folder: " + $folder.FullName 
      Remove-Item $folder.FullName -Recurse -Force 
     } 
     else 
     { 
      Write-host "Files found in $folder, skipping delete" 
     } 

     $childitems = $null 
    } 
} 
else 
{ 
    Write-Host "no sub folders found" 
} 

Cortesía de Guy Ellis Rocks: Powershell script to remove empty directories

+0

No es realmente lo que estaba buscando (tomando una dependencia de un archivo fuera del archivo msbuild) pero gracias. Podría ser útil algún día, ya que a veces uso PowerShell también. –

Cuestiones relacionadas