删除旧文件夹并保留最新文件夹

时间:2018-11-19 12:39:24

标签: powershell directory

最近我一直在写剧本,遇到了障碍。我正在删除自动创建的文件夹。我想删除这些文件的旧版本,同时保持新文件夹不变,例如:

  • 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 :(得分:1)

如果您要保留的最新文件夹也是创建时间最新的文件夹,则可以使用以下简单的单行格式:

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) }