在 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