2012-06-15 75 views
6

如何遞歸處理路徑,以便處理完成後路徑下不存在空目錄。使用msbuild刪除空目錄

例如,假設我們有C:\Dir1\Dir2\Dir3並且這些目錄中沒有任何文件。結果應該是刪除所有三個目錄。

我想在不使用自定義任務的情況下完成此操作。

回答

12

像這樣的事情應該工作,沒有檢查計數文件的成千上萬的性能,雖然剛拿到數組長度...

<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

我不認爲這是正確的。包含包含文件的目錄的目錄不得刪除。在OP的第一行查看有關遞歸等的確切文本。 –

+0

包含一個包含文件的目錄的目錄不會被刪除,因爲具有AllDirectories選項的這個目錄的文件計數不會是0. –

+0

Ahhh,我沒有關注'AllDirectories'部分。對於包含深層樹中大量文件的深度嵌套樹,效率有點低,但我懷疑這在實踐中通常是一個問題。不過,我覺得它很優雅。謝謝! –

3

使用一個Exec任務運行的PowerShell:

的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> 

PowerShell的RemoveDir.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" 
} 

禮貌Guy Ellis Rocks: Powershell script to remove empty directories

+0

算不上什麼我一直在尋找(取決於msbuild文件之外的文件),但是謝謝。有一天可能會派上用場,因爲我有時也會使用PowerShell。 –