Удаление старых папок и сохранение самых последних - PullRequest
0 голосов
/ 19 ноября 2018

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

  • 18.212.1021.0008 // Создано 19/11/2018 12: 12
  • 18.212.1021.0008_1 // Создано 19/11/2018 12: 23
  • 18.212.1021.0008_2 // Создано 19/11/2018 12: 27
  • 18.212.1021.0008_3 // Создано 19/11/2018 12: 32

Я бы хотел сохранить 18.212.1021.008_3, поэтому, я думаю, мне нужно сохранить папку с самой последней датой создания.

Пожалуйста, смотрите код ниже:

    $Versionarray = 13..20
    Get-ChildItem "$env:LOCALAPPDATA\Microsoft\OneDrive" -Recurse | Where-Object {
        # Recusivly deletes OneDrive version folders within
        # Appdata\local which build up everytime OneDrive
        # is installed/script is run
        $item = $_
        $item -is [System.IO.DirectoryInfo] -and (
            $Versionarray | Where-Object { $item.Name.Contains($_) }
        )
    } | Remove-Item -Recurse -Confirm:$false -ErrorAction SilentlyContinue

1 Ответ

0 голосов
/ 19 ноября 2018

Если самая новая папка, которую вы хотите сохранить, также является папкой с самым новым временем создания, вы можете использовать эту простую однострочную строку:

Get-ChildItem "$env:LOCALAPPDATA\Microsoft\OneDrive" -Directory | sort CreationTime | select -SkipLast 1 | Remove-Item -Recurse -Force

Если вы хотите отфильтровать только определенный типпапки по имени, вы можете использовать простое совпадение регулярных выраженийЯ не могу помочь вам с точным регулярным выражением (так как я должен был бы знать ваш шаблон именования папок), но это выглядело бы примерно так:

Get-ChildItem "$env:LOCALAPPDATA\Microsoft\OneDrive" -Directory | where Name -match '\d\d+' | sort CreationTime | select -SkipLast 1 | Remove-Item -Recurse -Force

(Обратите внимание, что это синтаксис может не работать, если вы используетестарая версия Powershell. Если это так, дайте мне знать, и я предоставлю совместимое решение для отката.)

ОБНОВЛЕНИЕ

В ответ на ваш комментарий: Ваши требованиявсе еще немного неясно, но вот кое-что для начала:

Если вы хотите удалить только папки, которые «похожи» на версии папок, вы можете настроить регулярное выражение в фильтре where._\d+$ будет сопоставлять что-либо с подчеркиванием и цифрами в конце:

where $_.Name -match '_\d+$'

Если вы также хотите убедиться, что это на самом деле версионная копия другой существующей папки, вы также можете проверить это:

where { $_.FullName -match '^(?<OriginalPath>.+)_\d+$' -and (Test-Path $Matches.OriginalPath) }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...