Подсчет удаленных пустых папок - PullRequest
1 голос
/ 04 марта 2011

У меня есть скрипт, который ищет все файлы определенного дня и определенного расширения и удаляет все файлы. Это отлично работает, и это прекрасно

Затем я должен удалить все папки, которые соответствуют пустым, включая все подпапки. Я также должен вывести это в файл и отобразить каждый удаленный файл. Вывод будет показывать 30 удаленных папок, но на самом деле было удалено 48.

Теперь мой вопрос: я пытаюсь подсчитать все удаленные папки. У меня есть этот скрипт, но он просто считает самые глубокие папки, а не все удаленные. Вот часть скрипта, которую я не могу сосчитать

$TargetFolder = "C:\Users\user\Desktop\temp"
$LogFile = "C:\Summary.txt"
$Count = 0

Date | Out-File -filepath $LogFile

get-childitem $TargetFolder -recurse -force | Where-Object {$_.psIsContainer}| sort fullName -des |
Where-Object {!(get-childitem $_.fullName -force)} | ForEach-Object{$Count++; $_.fullName} | remove-item -whatif | Out-File -filepath $LogFile -append

$Count = "Total Folders = " + $Count
$Count | Out-File -filepath $LogFile -append

Ответы [ 2 ]

1 голос
/ 06 сентября 2011

Несмотря на то, что вызов сортировки будет правильно отправлять каждый каталог через конвейер в порядке вложения, так как они на самом деле не удаляются (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. При выполнении фактического удаления в пустом каталоге не нужно указывать ни один флаг.

0 голосов
/ 04 марта 2011

Не тестировалось:

 get-childitem $TargetFolder -recurse -force |
 where-object{$_.psiscontainer -and -not (get-childitem $_.fullname -recurse -force | where-object {!($_.psiscontainer)}}|
 sort fullName -des |
 Where-Object {!(get-childitem $.fullName -force)} |
 ForEach-Object{$Count++; $_.fullName} |
 remove-item -whatif |
 Out-File -filepath $LogFile -append
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...