2016-08-11 7 views
1

Я сортирую папки в каталоге в соответствии с номерами и удаляя старые. Проблема, с которой я столкнулась, благодаря стандарту управления версиями octopus deploy. Если вы выпустите проект с той же версией несколько раз, цифры будут выглядеть так:Сортировка по номерам версий в 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})?$', '$1') } -Descending | 
    Select-Object -Skip $NumberToSave | 
    Remove-Item -Recurse -Force -Verbose 
    } 
} 

Что я могу сделать, чтобы разместить эти подчеркивания в моей сортировке?

ответ

1

Сортировка-Объект может выполняться с несколькими аргументами.

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

Я не знал, что, благодаря –

1

Разделить Name недвижимости по _ - выводу первой части в качестве [version] объекта, а затем суффикс последнего:

... |Sort-Object { 
     $version,$suffix = $_.Name -split '_' 
     $version -as [version] 
     if($suffix){$suffix} 
} 
+0

Вашему коду дал неправильный вывод, когда я использовал другой набор данных. Он считал, что 3.0.2.2 является более крупной версией, чем 3.0.2.13_3 или даже 3.0.2.13. Может быть, нам что-то не хватает. Ответ Криса Дента правильно отсортировал их. Но спасибо, потому что я кое-что узнал от вас. –

0

Я бы умножать пересмотр с 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  
+0

Спасибо, я могу использовать это позже в другом месте –