2016-08-11 53 views
1

我正在根據版本號碼對目錄中的文件夾進行排序並刪除舊的文件夾。 我遇到的問題得益於章魚部署的版本標準。如果您多次發佈具有相同版本的項目,數字將如下所示;根據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可以在多個參數上執行。

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。也許我們在這裏錯過了些什麼。 Chris Dent的回答正確地排序了他們。但是,謝謝,因爲我也從你那裏學到了一些東西。 –

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

謝謝,我可以在其他地方使用它 –