使用PowerShell处理含版本号文件:分组保留最新版本并删旧版
用PowerShell批量保留最新版本文件并删除旧版本
需求说明
需要处理一批带版本号的文件,按文件名前缀分组,仅保留每组中的最新版本文件,删除其余旧版本。示例文件:
FileBam-0.10.1.zip FileBam-0.2.0.zip FileBoozle-1.7.2.zip FileBoozle-1.7.5.zip FileBoozle-1.7.10.zip FileWam-0.97.40.zip OtherFile-5.5.zip
解决方案脚本
# 替换为你的目标文件目录 $targetDir = "C:\Your\Target\Directory" # 遍历文件、提取前缀和版本号,再分组处理 Get-ChildItem -Path $targetDir -Filter "*.zip" | ForEach-Object { # 匹配前缀(-之前的内容)和版本号(数字+点的组合) if ($_.BaseName -match '^(.+?)-(\d+\.\d+(\.\d+)?)$') { [PSCustomObject]@{ File = $_ Prefix = $matches[1] Version = [version]$matches[2] } } } | # 按前缀分组 Group-Object -Property Prefix | # 只保留包含2个及以上文件的分组 Where-Object { $_.Count -ge 2 } | ForEach-Object { # 按版本号降序排序,跳过第一个(最新版本),删除剩余旧文件 $_.Group | Sort-Object Version -Descending | Select-Object -Skip 1 | ForEach-Object { # 先打印待删除文件路径(用于验证) Write-Host "待删除旧版本: $($_.File.FullName)" # 确认无误后,注释掉上面的Write-Host,启用下面的删除命令 # Remove-Item -Path $_.File.FullName -Force } }
关键细节说明
- 正则匹配规则:
^(.+?)-(\d+\.\d+(\.\d+)?)$精准匹配-分隔的前缀和版本号,支持两位(如5.5)或三位(如0.10.1)版本格式。 - 版本号正确排序:将提取的版本号转为
[version]类型,避免字符串排序的错误(比如0.10.1字符串排序会比0.2.0小,但实际版本更高)。 - 安全验证:脚本默认只打印待删除文件路径,确认无误后再启用
Remove-Item命令,防止误删。
内容的提问来源于stack exchange,提问作者mklement0
相关产品推荐
相关产品推荐

