Вы можете сделать что-то вроде следующего и просто удалить -WhatIf
, если вы удовлетворены результатами:
$Time = (Get-Date).AddMinutes(-30)
Get-ChildItem -Path 'C:\MostCommonLeaf' -Recurse -File -Filter '*.xml' |
Where {$_.CreationTime -lt $Time -and (Split-Path $_.DirectoryName -Leaf) -match '^[1-6]' -and $_.Extension -eq '.xml'} |
Remove-Item -WhatIf
MostCommonLeaf
будет папкой самого низкого уровня, которая может начинаться как ваша root поисковый узел. По сути, мы не хотим ни за что проходить каталоги.
Вы могли бы потенциально улучшить вышеприведенный скрипт, если бы вы больше знали о структуре каталогов. Например, если это предсказуемо в пути, где будут находиться папки 1xxx
, вы можете создать параметр -Path
, чтобы использовать подстановочный знак диапазона [1-6]
. Например, -Filter '*.xml'
также может возвращать файлы .xmls
, поэтому в Where
.
есть дополнительное условие расширения, при котором -Recurse
и -Include
вместе используются, как правило, для более медленных запросов. Поэтому, даже если соблазниться, я бы избежал решения, которое бы использовало их вместе.
Если бы существовали миллионы файлов / каталогов, другая конструкция команды могла бы быть лучше. Выполнение Split-Path
миллионов раз может быть менее эффективным, чем простое сопоставление с именем каталога, например, where {$_.DirectoryName -match '\\[1-6][^\\]*$'}
.