如何遞歸處理路徑,以便處理完成後路徑下不存在空目錄。使用msbuild刪除空目錄
例如,假設我們有C:\Dir1\Dir2\Dir3
並且這些目錄中沒有任何文件。結果應該是刪除所有三個目錄。
我想在不使用自定義任務的情況下完成此操作。
如何遞歸處理路徑,以便處理完成後路徑下不存在空目錄。使用msbuild刪除空目錄
例如,假設我們有C:\Dir1\Dir2\Dir3
並且這些目錄中沒有任何文件。結果應該是刪除所有三個目錄。
我想在不使用自定義任務的情況下完成此操作。
像這樣的事情應該工作,沒有檢查計數文件的成千上萬的性能,雖然剛拿到數組長度...
<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>
使用一個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
算不上什麼我一直在尋找(取決於msbuild文件之外的文件),但是謝謝。有一天可能會派上用場,因爲我有時也會使用PowerShell。 –
我不認爲這是正確的。包含包含文件的目錄的目錄不得刪除。在OP的第一行查看有關遞歸等的確切文本。 –
包含一個包含文件的目錄的目錄不會被刪除,因爲具有AllDirectories選項的這個目錄的文件計數不會是0. –
Ahhh,我沒有關注'AllDirectories'部分。對於包含深層樹中大量文件的深度嵌套樹,效率有點低,但我懷疑這在實踐中通常是一個問題。不過,我覺得它很優雅。謝謝! –