Несмотря на то, что вызов сортировки будет правильно отправлять каждый каталог через конвейер в порядке вложения, так как они на самом деле не удаляются (remove-item -whatif
), родители по-прежнему будут содержать свои пустые дочерние каталоги и поэтому не будут проходить второе условие ( !(get-childitem $_.fullName -force)
). Также обратите внимание, что Remove-Item
не выводит никаких данных, поэтому удаленные каталоги не будут отображаться в журнале.
Адаптация Ответа Кита Хилла к аналогичному вопросу , вот модифицированная версия исходного скрипта, которая использует фильтр для извлечения сначала всех пустых каталогов, а затем удаляет и регистрирует каждый из них. :
filter Where-Empty {
$children = @($_ |
Get-ChildItem -Recurse -Force |
Where-Object { -not $_.PSIsContainer })
if( $_.PSIsContainer -and $children.Length -eq 0 ) {
$_
}
}
$emptyDirectories = @(
Get-ChildItem $TargetFolder -Recurse -Force |
Where-Empty |
Sort-Object -Property FullName -Descending)
$emptyDirectories | ForEach-Object {
$_ | Remove-Item -WhatIf -Recurse
$_.FullName | Out-File -FilePath $LogFile -Append
}
$Count = $emptyDirectories.Count
"Total Folders = $Count" | Out-File -FilePath $LogFile -Append
Обратите внимание, что -Recurse
был добавлен к вызову Remove-Item
, поскольку пустые дочерние каталоги останутся при использовании -WhatIf
. При выполнении фактического удаления в пустом каталоге не нужно указывать ни один флаг.