Сортировка версий PowerShell

В PowerShell, если у меня есть список строк, содержащих версии, "3.0.1.1", "3.2.1.1" и т.д., как я могу отсортировать его так, как System.Version будет сортировать его в С#?

Ответ 1

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

Ответ 2

Просто преобразуйте его в версию и отсортируйте по этому пути:

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

Ответ 3

# 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
#>

Ответ 4

Просто добавьте еще один угловой случай: powershell рассматривает этот однозначный вид версии "2" как недействительный. Необходимо добавить '.0' до конца, чтобы создать объект версии перед сортировкой:

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

Ответ 5

Строка версии может быть приведена к объекту Version, а объект 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

(Добавлена дополнительная строка версии, чтобы сделать пример действительно значимым.)