在 PowerShell 中根据版本号排序
Sorting according to version numbers in PowerShell
我正在根据 版本 编号对目录中的文件夹进行排序,并删除旧的。
我遇到的问题是由于章鱼部署的版本控制标准。如果多次发布同一个版本的项目,数字会是这样的;
1.3.5.6
1.3.5.6_1
1.3.5.6_2
1.3.5.7
那些下划线正在扼杀我的算法。我的功能如下;
function CleanUp-Files ($col,$NumberToSave) {
foreach ($pkg in $col.FullName) {
Get-ChildItem -Path $pkg |
Where-Object {$_.PsIscontainer} |
Sort-Object { [version]($_.Name -replace '^(\d+(\.\d+){1,3})(_\d{1,2})?$', '') } -Descending |
Select-Object -Skip $NumberToSave |
Remove-Item -Recurse -Force -Verbose
}
}
如何将这些下划线纳入我的排序?
Sort-Object 可以在多个参数上执行。
Sort-Object { [Version]($_ -replace '_.*$') }, { if ($_ -match '_') { [Int]($_ -replace '^.*_') } else { 0 } }
将 Name
属性 拆分为 _
- 首先将第一部分输出为 [version]
对象,然后是后缀:
... |Sort-Object {
$version,$suffix = $_.Name -split '_'
$version -as [version]
if($suffix){$suffix}
}
我会将修订乘以 100 并在下划线后添加数字:
function CleanUp-Files ($col,$NumberToSave) {
$rex = [regex]'(.*\.)(\d+)_?(\d+)?'
$callback = {
param($match)
'{0}{1}' -f $match.Groups[1].Value , ([int]$match.Groups[2].Value * 100 +[int]$match.Groups[3].Value)
}
foreach ($pkg in $col.FullName) {
Get-ChildItem -Path $pkg |
Where-Object {$_.PsIscontainer} |
Sort-Object { [version]($rex.Replace($_.Name, $callback)) } -Descending |
Select-Object -Skip $NumberToSave |
Remove-Item -Recurse -Force -Verbose
}
}
一个简单的演示:
$versions = '1.3.5.6', '1.3.5.6_1', '1.3.5.6_2', '1.3.5.7'
$rex = [regex]'(.*\.)(\d+)_?(\d+)?'
$callback = {
param($match)
'{0}{1}' -f $match.Groups[1].Value , ([int]$match.Groups[2].Value * 100 +[int]$match.Groups[3].Value)
}
$versions | ForEach-Object {
[version]($rex.Replace($_, $callback))
}
会给你:
Major Minor Build Revision
----- ----- ----- --------
1 3 5 600
1 3 5 601
1 3 5 602
1 3 5 700
我正在根据 版本 编号对目录中的文件夹进行排序,并删除旧的。 我遇到的问题是由于章鱼部署的版本控制标准。如果多次发布同一个版本的项目,数字会是这样的;
1.3.5.6
1.3.5.6_1
1.3.5.6_2
1.3.5.7
那些下划线正在扼杀我的算法。我的功能如下;
function CleanUp-Files ($col,$NumberToSave) {
foreach ($pkg in $col.FullName) {
Get-ChildItem -Path $pkg |
Where-Object {$_.PsIscontainer} |
Sort-Object { [version]($_.Name -replace '^(\d+(\.\d+){1,3})(_\d{1,2})?$', '') } -Descending |
Select-Object -Skip $NumberToSave |
Remove-Item -Recurse -Force -Verbose
}
}
如何将这些下划线纳入我的排序?
Sort-Object 可以在多个参数上执行。
Sort-Object { [Version]($_ -replace '_.*$') }, { if ($_ -match '_') { [Int]($_ -replace '^.*_') } else { 0 } }
将 Name
属性 拆分为 _
- 首先将第一部分输出为 [version]
对象,然后是后缀:
... |Sort-Object {
$version,$suffix = $_.Name -split '_'
$version -as [version]
if($suffix){$suffix}
}
我会将修订乘以 100 并在下划线后添加数字:
function CleanUp-Files ($col,$NumberToSave) {
$rex = [regex]'(.*\.)(\d+)_?(\d+)?'
$callback = {
param($match)
'{0}{1}' -f $match.Groups[1].Value , ([int]$match.Groups[2].Value * 100 +[int]$match.Groups[3].Value)
}
foreach ($pkg in $col.FullName) {
Get-ChildItem -Path $pkg |
Where-Object {$_.PsIscontainer} |
Sort-Object { [version]($rex.Replace($_.Name, $callback)) } -Descending |
Select-Object -Skip $NumberToSave |
Remove-Item -Recurse -Force -Verbose
}
}
一个简单的演示:
$versions = '1.3.5.6', '1.3.5.6_1', '1.3.5.6_2', '1.3.5.7'
$rex = [regex]'(.*\.)(\d+)_?(\d+)?'
$callback = {
param($match)
'{0}{1}' -f $match.Groups[1].Value , ([int]$match.Groups[2].Value * 100 +[int]$match.Groups[3].Value)
}
$versions | ForEach-Object {
[version]($rex.Replace($_, $callback))
}
会给你:
Major Minor Build Revision
----- ----- ----- --------
1 3 5 600
1 3 5 601
1 3 5 602
1 3 5 700