根据PowerShell中的版本号进行排序
我正在根据版本号对目录中的文件夹进行排序,并删除旧文件夹。 我遇到的问题要感谢octopus deploy的版本控制标准。如果您多次发布同一版本的项目,数字如下所示根据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
这些下划线正在破坏我的算法。我的职能如下
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