2012-06-15 13 views
6

Come posso elaborare un percorso in modo ricorsivo in modo che una volta completata l'elaborazione non ci siano directory vuote sotto il percorso.Rimuovere le directory vuote usando msbuild

Ad esempio, supponiamo di avere C:\Dir1\Dir2\Dir3 e non ci sono file in nessuna di queste directory. Il risultato dovrebbe essere la rimozione di tutte e tre le directory.

Mi piacerebbe farlo senza l'utilizzo di attività personalizzate.

risposta

12

Qualcosa del genere dovrebbe funzionare, non controllare le prestazioni di contare migliaia di file anche se solo per ottenere lunghezza dell'array ...

<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

Non penso che sia corretto. Una directory che contiene una directory che contiene file non deve essere cancellata. Vedere il testo preciso relativo alla ricorsione, ecc. Nella prima riga dell'OP. –

+0

Una directory che contiene una directory contenente file non verrà eliminata perché il numero di file per tale directory con l'opzione AllDirectories non sarà 0. –

+0

Ahhh, non ho prestato attenzione alla parte 'AllDirectories'. Un po 'inefficace per alberi profondamente annidati che contengono molti file in profondità nell'albero, ma dubito che di solito sarebbe un problema nella pratica. Lo trovo piuttosto elegante, però. Grazie! –

3

Utilizzando un PowerShell in esecuzione Exec Task:

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" 
} 

di cortesia al Guy Ellis Rocks: Powershell script to remove empty directories

+0

Non è proprio quello che cercavo (prendendo una dipendenza da un file al di fuori del file msbuild) ma grazie. Potrebbe tornare utile un giorno, visto che a volte uso anche PowerShell. –

Problemi correlati