根据PowerShell中的版本号进行排序

根据PowerShell中的版本号进行排序,powershell,octopus-deploy,Powershell,Octopus Deploy,我正在根据版本号对目录中的文件夹进行排序,并删除旧文件夹。 我遇到的问题要感谢octopus deploy的版本控制标准。如果您多次发布同一版本的项目,数字如下所示 这些下划线正在破坏我的算法。我的职能如下 function CleanUp-Files ($col,$NumberToSave) { foreach ($pkg in $col.FullName) { Get-ChildItem -Path $pkg | Where-Object {$_.PsIscontai

我正在根据版本号对目录中的文件夹进行排序,并删除旧文件夹。 我遇到的问题要感谢octopus deploy的版本控制标准。如果您多次发布同一版本的项目,数字如下所示



这些下划线正在破坏我的算法。我的职能如下

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})?$', '$1') } -Descending |
    Select-Object -Skip $NumberToSave |
    Remove-Item -Recurse -Force -Verbose
  }
}

如何将这些下划线纳入排序?

排序对象可以在多个参数上执行

Sort-Object { [Version]($_ -replace '_.*$') }, { if ($_ -match '_') { [Int]($_ -replace '^.*_') } else { 0 } }

名称
属性按
拆分-首先将第一部分输出为
[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     

当我使用不同的数据集时,您的代码返回了错误的输出。它认为3.0.2.2是比3.0.2.13_3甚至3.0.2.13更大的版本。也许我们错过了什么。克里斯·登特的回答把它们正确地分类了。但是谢谢,因为我也从你那里学到了一些东西。谢谢,我以后可以在其他地方用这个
Major  Minor  Build  Revision
-----  -----  -----  --------
1      3      5      600     
1      3      5      601     
1      3      5      602     
1      3      5      700