Powershell使用正则表达式删除文件

Powershell使用正则表达式删除文件

我的一个文件夹中有几千个不同版本的文件。

ACZ002-0.p
ACZ002-1.p
ACZ002-2.p
ACZ051-0.p
ACZ051-1.p
...

修订版本始终是点之前的最后一位数字。我只需要保留最新版本的文件,但我不知道如何处理我的代码。

$path = "E:\Export\"
$filter = [regex] "[A-Z]{3}[0-9]{3}\-[0-9]{1,2}\.(p)"
$files = Get-ChildItem -Path $path -Recurse | Where-Object {($_.Name -match $filter)}

答案1

可能有更好的方法可以做到这一点,但这是我首先想到的实现方法;这种方法在正则表达式中使用命名捕获组,使 powershell 更容易按基本文件名和修订版本进行排序和分组。最后一个变量 $filesToKeep 将是一个 FileInfo 对象数组,您可以从删除命令中排除它。当然,我建议在实际删除任何内容之前进行大量测试。

$filter = [regex] "(?<baseName>[A-Za-z]{3}[0-9]{3})\-(?<revision>[0-9]+)\.p"
$results = ls c:\temp -Recurse | where {$_.Name -match $filter} | foreach-object {
    new-object PSObject -Property @{
        BaseName = $matches.BaseName
        Revision = $matches.Revision
        File = $_
    }
}
$filesToKeep = $results | sort basename, revision  -Descending | group basename | ForEach-Object { $_.group | select -first 1 -ExpandProperty File}

相关内容