パスを再帰的に処理して、処理が完了するとパスの下に空のディレクトリがないようにするにはどうすればよいですか。
たとえば、C:\Dir1\Dir2\Dir3
これらのディレクトリのいずれにもファイルがなく、ファイルがないとします。結果として、3つのディレクトリすべてが削除されます。
カスタムタスクを使用せずにこれを実現したいと思います。
パスを再帰的に処理して、処理が完了するとパスの下に空のディレクトリがないようにするにはどうすればよいですか。
たとえば、C:\Dir1\Dir2\Dir3
これらのディレクトリのいずれにもファイルがなく、ファイルがないとします。結果として、3つのディレクトリすべてが削除されます。
カスタムタスクを使用せずにこれを実現したいと思います。
このようなものは機能するはずですが、配列の長さを取得するためだけに、何千ものファイルをカウントするパフォーマンスをチェックしませんでした...
<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スクリプト