我非常努力地寻找是否有办法改变sort-object
方法本身但不起作用。但我可以使用 StringComparer 静态类来完成类似的事情,如此所示msdn 示例 http://msdn.microsoft.com/en-us/library/system.stringcomparer.ordinalignorecase.aspx.
为了回答你的最后一部分,
At the very least, would it be possible to sort with uppercase characters first, as in XYZ, Xyz, xyz, YZ, yZ?
[System.StringComparer]::InvariantCultureIgnoreCase
是你的答案。为了了解差异,我尝试了下面所有不同的版本。
$arr = "0foo","xyz","Xyz","YZ","yZ","XYZ","Foo","bar"
$list = New-Object System.Collections.ArrayList
$list.AddRange($arr)
Write-host "CurrentCulture"
$list.Sort([System.StringComparer]::CurrentCulture);
$list
<# --------CurrentCulture--------
CurrentCulture
0foo
bar
Foo
xyz
Xyz
XYZ
yZ
YZ
#>
Write-Host "CurrentCultureIgnoreCase"
$list.Sort([System.StringComparer]::CurrentCultureIgnoreCase);
$list
<# --------CurrentCultureIgnoreCase--------
CurrentCultureIgnoreCase
0foo
bar
Foo
XYZ
Xyz
xyz
YZ
yZ
#>
Write-Host "InvariantCulture"
$list.Sort([System.StringComparer]::InvariantCulture);
$list
<# --------InvariantCulture--------
InvariantCulture
0foo
bar
Foo
xyz
Xyz
XYZ
yZ
YZ
#>
Write-Host "InvariantCultureIgnoreCase"
$list.Sort([System.StringComparer]::InvariantCultureIgnoreCase);
$list
<# --------InvariantCultureIgnoreCase--------
InvariantCultureIgnoreCase
0foo
bar
Foo
XYZ
Xyz
xyz
YZ
yZ
#>
Write-Host "Ordinal"
$list.Sort([System.StringComparer]::Ordinal);
$list
<# --------Ordinal--------
Ordinal
0foo
Foo
XYZ
Xyz
YZ
bar
xyz
yZ
#>
Write-Host "OrdinalIgnoreCase"
$list.Sort([System.StringComparer]::OrdinalIgnoreCase);
$list
<# --------OrdinalIgnoreCase--------
OrdinalIgnoreCase
0foo
bar
Foo
xyz
XYZ
Xyz
yZ
YZ
#>