В PowerShell, если у меня есть список строк, содержащих версии, "3.0.1.1", "3.2.1.1" и т.д., как я могу отсортировать его так, как System.Version будет сортировать его в С#?
Сортировка версий PowerShell
Ответ 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
(Добавлена дополнительная строка версии, чтобы сделать пример действительно значимым.)