2013-08-31 5 views
5

Linux共有にマップされたドライブで作業する場合、ファイル名は大文字と小文字が区別されます。 PowerShellはこれを期待どおりに処理しますが、 "C"ロケールで使用されているソート順に類似した方法で出力をソートしたいと思います。これは、文字の値をU + 0000からU +希望ソートオブジェクトの動作を変更する

PS > gci Z:\foo | sort -casesensitive 
xyz 
Xyz 
XYZ 
yZ 
YZ 

出力:問題を説明するために

10FFFF( 'バー' と 'バー' 'foo' で前に来る前に来る 'はFoo' と 'foo' で前に例えば '0fooは' 来る)

XYZ 
Xyz 
YZ 
xyz 
yZ 

現在のスレッドのカルチャ変数を[System.Globalization.CultureInfo]::InvariantCultureに設定しようとしましたしかし、私は成功しませんでした:

$thrd = [Threading.Thread]::CurrentThread 
$thrd.CurrentCulture = [Globalization.CultureInfo]::InvariantCulture 
$thrd.CurrentUICulture = $thrd.CurrentCulture 

私はそれが文化情報と関係があると仮定するか、私は本当に遠く離れていますか?誰が私がどこから始めなければならないか考えていますか?私は一時的に私が望む振る舞いを持つCultureInfoインスタンスを作成する必要があると推測していますが、CompareInfoが行くまではゲッターしかありませんが、CompareInfo.Compare関数をオーバーロードする方法が分かりません。 PowerShell関数を使用する必要があります。それは不可能なので、事実上失われた原因ですか?

編集

少なくとも、XYZ、エクシーズ、XYZ、YZ、YZのように、最初の文字を大文字でソートすることも可能だろうか?

+1

「序」は、それらのコードポイント値に基づいて文字を比較.NETの比較である(また、〔にInvariantCultureと順序文字列比較の違いを参照してください(http://stackoverflow.com/a/492885/2495 ))。 [[StringComparer] :: Ordinal'](http://msdn.microsoft.com/en-us/library/system.stringcomparer)で[Mitulの答え](http://stackoverflow.com/a/18544765/2495) .ordinal.aspx)が最良の選択のように見えます。 –

答えて

7

sort-objectメソッド自体を変更する方法がありますが、機能していない場合は、実際には見つけられませんでした。しかし、私はこのmsdn exampleで示されているように、StringComparer静的クラスを使用して同様のことを達成できました。

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

非常に徹底的。私はこのようなことをする必要はないと思っていましたが、PowerShellの場合でも、並べ替えのアイデアは限られているようです。どうもありがとうございました。 –

関連する問題