按多个属性对对象进行排序

And*_*Gis 4 powershell

我正在尝试使用 PowerShell 对表示应用程序版本的对象进行排序

$versionsObjects = @{
    Major = 3
    Minor = 2
    Bugfix = 1
},
@{
    Major = 3
    Minor = 5
    Bugfix = 1
},
@{
    Major = 1
    Minor = 2
    Bugfix = 1
},
@{
    Major = 4
    Minor = 2
    Bugfix = 1
}

$sortedVersions = ($versionsObjects | Sort-Object -Property @{Expression="Major"; Descending=$true}, @{Expression="Minor" ;Descending=$true}, @{Expression="Bugfix"; Descending=$true})
$sortedVersions | %{echo ( "{0}.{1}.{2}" -f $_.Major, $_.Minor, $_.Bugfix)}
Run Code Online (Sandbox Code Playgroud)

输出与输入的顺序相同:

3.2.1
3.5.1
1.2.1
4.2.1
Run Code Online (Sandbox Code Playgroud)

但应该是

4.2.1
3.5.1
3.2.1
1.2.1
Run Code Online (Sandbox Code Playgroud)

我究竟做错了什么?

Mik*_*ard 5

你的表达不太对。试试这个 Sort-Object 部分:

Sort-Object -Property @{Expression={$_.Major}; Descending=$true}, @{Expression={$_.Minor} ;Descending=$true}, @{Expression={$_.Bugfix}; Descending=$true})
Run Code Online (Sandbox Code Playgroud)


CB.*_*CB. 4

如果你至少在 powershell v3.0 中,你可以这样做:

$versionsObjects = [ordered]@{
    Major = 3
    Minor = 2
    Bugfix = 1
},
[ordered]@{
    Major = 3
    Minor = 5
    Bugfix = 1
},
[ordered]@{
    Major = 1
    Minor = 2
    Bugfix = 1
},
[ordered]@{
    Major = 4
    Minor = 2
    Bugfix = 1
}

$versionsObjects | % { $_.values  -join '.' } | sort -Descending {[version]$_ }
Run Code Online (Sandbox Code Playgroud)

或对于所有版本:

$versionsObjects = @{
    Major = 3
    Minor = 2
    Bugfix = 1
},
@{
    Major = 3
    Minor = 5
    Bugfix = 1
},
@{
    Major = 1
    Minor = 2
    Bugfix = 1
},
@{
    Major = 4
    Minor = 2
    Bugfix = 1
}

$versionsObjects | % { $_.Major,$_.Minor,$_.bugfix  -join '.' } | sort -Descending {[version]$_ }
Run Code Online (Sandbox Code Playgroud)

  • @gisek 没有字符串比较..net 对象 `[version]` 比较!尝试一下 ;) (2认同)