programing

PowerShell 버전 정렬

skycolor 2023. 9. 4. 19:41
반응형

PowerShell 버전 정렬

PowerShell에서 "3.0.1.1", "3.2.1.1" 등 버전이 포함된 문자열 목록이 있는 경우 시스템 방식으로 정렬하려면 어떻게 해야 합니까?버전에서 C#으로 정렬하시겠습니까?

PS C:\> $ver="3.0.1.1","3.2.1.1"
PS C:\> $ver|%{[System.Version]$_}|sort

Major  Minor  Build  Revision
-----  -----  -----  --------
3      0      1      1
3      2      1      1

버전으로 변환하고 다음과 같이 정렬합니다.

$list = "3.0.1.1","3.2.1.1" 
$sorted = $list | %{ new-object System.Version ($_) } | sort

버전 문자열을 버전 개체에 캐스트할 수 있습니다.sort-object스크립트 블록을 통과하고 결과를 정렬할 수 있습니다.

PS C:\Users\me> "3.11.0.1", "3.0.1.1", "3.2.1.1" | sort
3.0.1.1
3.11.0.1
3.2.1.1

PS C:\Users\me> "3.11.0.1", "3.0.1.1", "3.2.1.1" | sort {[version] $_}
3.0.1.1
3.2.1.1
3.11.0.1

(예를 실제로 의미 있게 만들기 위해 버전 문자열을 추가했습니다.)

# I needed to sort historical versions (Octopus) with varying decimal formats.
# Try # this (it is easy to add to a more complex expression sort)
# Special Case "3.00.1.10.1.10" and "3.0.1.10.1.10" required the double sort
# to work correctly
    $vers = @()`enter code here`
    $vers +=  @( "3.1.60",      "3.1.52","3.1.51")
    $vers +=  @( "3.00.46",     "3.00.36","3.50.2145.11")
    $vers +=  @( "3.50.2145.10","3.50.2145.9")
    $vers +=  @( "3.50.2145.8", "3.50.2145.7")
    $vers +=  @( "3.50.2145.6", "3.50.2145.5")
    $vers +=  @( "3.50.2145.4", "3.50.2145.3")
    $vers +=  @( "3.50.2145.2", "3.50.2145.1")
    $vers +=  @( "3.50.2145",   "3.50.2143")
    $vers +=  @( "3.50.2141",    "3.50.2135")    
    $vers +=  @( "3.0.1.10.1.1", "3.00.1.10.1.10")
    $vers +=  @( "2.1.3.4",      "3.0","3.")
    $vers +=  @( "3.0.1.10.1.100","3.0.1.10.1.10")
    $mySortAsc = @{Expression={ [regex]::Replace($_ ,'\d+', { $args[0].Value.PadLeft(20,'0') }) };Descending=$false}
    $mySortDesc = @{Expression={ [regex]::Replace($_ ,'\d+', { $args[0].Value.PadLeft(20,'0') }) };Descending=$true}    
    $nl = [Environment]::NewLine
    Write-Output ($nl + "Ascending Sort" + $nl);
    $vers | Sort-Object | Sort-Object $mySortAsc
    Write-Output ($nl + "Descending Sort" + $nl);
    $vers | Sort-Object -Descending | Sort-Object $mySortDesc
<# Result
Ascending Sort

2.1.3.4
3.
3.0
3.0.1.10.1.1
3.0.1.10.1.10
3.00.1.10.1.10
3.0.1.10.1.100
3.00.36
3.00.46
3.1.51
3.1.52
3.1.60
3.50.2135
3.50.2141
3.50.2143
3.50.2145
3.50.2145.1
3.50.2145.2
3.50.2145.3
3.50.2145.4
3.50.2145.5
3.50.2145.6
3.50.2145.7
3.50.2145.8
3.50.2145.9
3.50.2145.10
3.50.2145.11

Descending Sort

3.50.2145.11
3.50.2145.10
3.50.2145.9
3.50.2145.8
3.50.2145.7
3.50.2145.6
3.50.2145.5
3.50.2145.4
3.50.2145.3
3.50.2145.2
3.50.2145.1
3.50.2145
3.50.2143
3.50.2141
3.50.2135
3.1.60
3.1.52
3.1.51
3.00.46
3.00.36
3.0.1.10.1.100
3.00.1.10.1.10
3.0.1.10.1.10
3.0.1.10.1.1
3.0
3.
2.1.3.4
#>

다른 코너 케이스를 추가하자면, powershell은 이 한 자리 수 버전 '2'를 유효하지 않은 것으로 처리합니다.정렬하기 전에 버전 개체를 만들려면 끝에 '.0'을 추가해야 합니다.

if($version  -match '^\d$')
{
  $version = $version + '.0'
}
New-Object System.Version $version

언급URL : https://stackoverflow.com/questions/711107/sorting-powershell-versions

반응형