C: \ Temp \ ifc содержит около 297 папок, в которых разбросано около 4,1 миллиона файлов.
Используя сценарий, который я нашел в другом месте на этом сайте, я написал следующее, чтобы удалить все «файлы» старше 1 часа.
$TargetFolder = “C:\Temp\ifc”
$NumberRange = "-1"
Get-ChildItem $TargetFolder -Recurse | Where {$_.lastwritetime -lt (Get-Date).AddHours($NumberRange)} | Remove-Item
Проблема, с которой я столкнулся, заключается в том, что он также удаляет подпапки (если в этих папках нет файлов).
Что я могу добавить к этому, чтобы структура папок оставалась на месте?
Большое спасибо.
Вы можете добавить дополнительное предложение where, чтобы игнорировать такие папки:
Where-Object{!($_.PSIsContainer)}
В приведенном выше фрагменте кода;
!
значит нет, $_
означает текущее значение объекта в трубе, PSIsContainer
это свойство текущего объекта, которое возвращает true
или false
в зависимости от того, папка это или нет. Так !($_.PSIsContainer)
означает, что текущее значение объекта в трубе не является папкой,
который оценивается Where-Object{}
Тогда ваш сценарий будет таким:
$TargetFolder = “C:\Temp\ifc\”
$NumberRange = "-1"
Get-ChildItem $TargetFolder -Recurse | Where-Object{!($_.PSIsContainer)} | Where {$_.lastwritetime -lt (Get-Date).AddHours($NumberRange)} | Remove-Item
Другой подход - игнорировать папки при вызове Get-ChildItem
используя -File
такой параметр:
$TargetFolder = “C:\Temp\ifc\”
$NumberRange = "-1"
Get-ChildItem $TargetFolder -File -Recurse | Where {$_.lastwritetime -lt (Get-Date).AddHours($NumberRange)} | Remove-Item
Этот подход имеет то преимущество, что возвращает файловые объекты на более раннем этапе цикла выполнения и делает командную строку короче. В зависимости от количества объектов на пути это может также дать ощутимое улучшение скорости.