2017-02-20 17 views
0

У меня есть каталог, который состоит из многих подкаталогов. Пример: «\ IP \ Share \ Directory \ Machine \ Year \ Month \ Date \ Image_ID"Удалить каталог на основе Созданная дата независимо от содержимого

Проблема заключается в том, что в этом каталоге хранятся изображения, и мне нужно удалить все изображения, хранящиеся выше 730 дней. Проблема в том, что в папке «Image_ID» есть сотни изображений. Иногда вы можете создать до 100 имен файлов «Image_ID». Мне нужно создать скрипт PowerShell, который будет искать каталог , чтобы создать дату, сортировать и удалить шкаф каталога с «IP-адресом», который был создан старше 730 дней (не для изображений/файлов, поскольку этот процесс может принимать весь день).

Это ежедневная задача, и мне нужно свести к минимуму продолжительность задачи. Поэтому я решил найти дату каталога, а не дату файла.

Это сценарий, который я использую, который работает для меня. Но его принятие очень долго, чтобы закончить, он работает те же удаления строки несколько раз, чтобы просто удалить поддиректорий папки:

Param (
    [string]$Source = "\IP\Share\Directory\Machine\Year\Month\Date\Image ID", 
    [string]$Days = "730" 
) 


$Folder = Get-ChildItem $Source -Recurse | Where-Object { !$_.PSIsContainer -and $_.LastWriteTime -le (get-date).adddays(-$($Days)) } 

$Folder | Remove-Item -Force 

$Folder = Get-ChildItem $source -Recurse -Force | Where {$_.PSIsContainer} | Sort-Object FullName -Descending | Where {!(Get-ChildItem $_.FullName -Force)} 

$Folder | Remove-Item -Force 

$Folder = Get-ChildItem $source -Recurse -Force | Where {$_.PSIsContainer} | Sort-Object FullName -Descending | Where {!(Get-ChildItem $_.FullName -Force)} 

$Folder | Remove-Item -Force 

$Folder = Get-ChildItem $source -Recurse -Force | Where {$_.PSIsContainer} | Sort-Object FullName -Descending | Where {!(Get-ChildItem $_.FullName -Force)} 

$Folder | Remove-Item -Force 

$Folder = Get-ChildItem $source -Recurse -Force | Where {$_.PSIsContainer} | Sort-Object FullName -Descending | Where {!(Get-ChildItem $_.FullName -Force)} 

$Folder | Remove-Item -Force 

stop-process -Id $PID 
} 

Если я не объяснить что-то правильно, я попытаюсь прояснить. Я новичок в PowerShell, и этот скрипт был комбинацией нескольких, которые я создал.

+0

Я не уверен, что я следую. Кажется, вы повторяете один и тот же кусок кода несколько раз! – gvee

ответ

1

Очевидные проблемы с вашим кодом:

  1. множественного перечисления медленного сетевого пути
  2. Get-ChildItem производит объекты для каждого файла, который получает отбрасываются в следующем Where, потому что вы не указали параметр -Directory доступный с тех пор, как PowerShell 3.0
  3. Существует также известная проблема с медленным ходом Get-ChildItem по сетевым путям.

Более эффективный подход заключается в использовании IO.DirectoryInfo.GetDirectories поэтому весь код будет:

$DateCutOff = (Get-Date).AddDays(-$Days) 
([IO.DirectoryInfo]$Source).GetDirectories('*', [IO.SearchOption]::AllDirectories) | 
    Where { $_.LastWriteTime -le $DateCutOff } | 
    ForEach { $_.Delete($true) } # recursively delete all subdirectories 

Тест этот код с $_.FullName в блоке ForEach, чтобы первым увидеть список и проверить, если это нормально ,

P.S. В .NET 4 и новее IO.DirectoryInfo.EnumerateDirectories - еще лучший выбор.