Назад | Перейти на главную страницу

Удалите только файлы, оставив пустые подпапки, с помощью powershell

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

Этот подход имеет то преимущество, что возвращает файловые объекты на более раннем этапе цикла выполнения и делает командную строку короче. В зависимости от количества объектов на пути это может также дать ощутимое улучшение скорости.