Скрипт Powershell, который будет искать папки с регулярным выражением и который удалит файлы старше XX - PullRequest
0 голосов
/ 01 марта 2020

Мне нужен скрипт powershell;

  • он должен искать в некоторых подпапках, имена папок которых начинаются с символа от 1 до 6 (например, 1xxxx или 2xxx)
  • и используя имя из этих папок в качестве переменных он должен искать в каждой папке файлы *. XML старше 30 минут
  • и, если он их находит, он должен удалить их.
  • может быть несколько папок одновременно, которые обеспечивают одинаковые условия, поэтому IMO с использованием массива является хорошим выбором. Но я всегда открыт для других идей.

Кто-нибудь может мне помочь, пожалуйста?

В основном, я использовал это до того, как менялись потребности, но теперь это не помогает мне.

powershell -nologo -command Get-ChildItem -Path C:\geniusopen\inbox\000\ready\processed | Where CreationTime -lt  (Get-Date).AddDays(-10) | remove-item

Спасибо

Ответы [ 2 ]

0 голосов
/ 01 марта 2020

Вы можете сделать что-то вроде следующего и просто удалить -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][^\\]*$'}.

0 голосов
/ 01 марта 2020

Я думаю, вы ищете что-то вроде этого:

$limit = (Get-Date).AddMinutes(-30)
$path = "C:\Users\you\xxx"
$Extension = "*.xml"

Get-ChildItem -Path $path -Filter $Extension -Force | Where-Object {$_.CreationTime -lt $limit} | Remove-Item

Я еще не проверял это.

Имейте в виду, нужно ли вам: $ .CreationTime или $ .LastWriteTime

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...