2013-08-31 33 views
5

Linux paylaşımına eşlenmiş bir sürücü ile çalışırken, dosya adları büyük/küçük harf duyarlıdır. PowerShell bunu beklendiği gibi ele alır, ancak çıktıyı "C" yerel ayarında kullanılan sıralama düzenine benzer bir şekilde sıralamak isterim. Bu, U + 0000'den artan şekilde U + 0'dan karakter sırasına göre sıralama anlamına gelir. istenenAlter Sort-Object davranış

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

Çıkış: sorunu göstermek için

10FFFF değerinden ('bar' ve 'bar 'foo' önce gelir önce gelir 'foo' ve 'foo' önce, örneğin '0foo' gelir)

XYZ 
Xyz 
YZ 
xyz 
yZ 

Geçerli iş parçacığı kültür değişkenlerini [System.Globalization.CultureInfo]::InvariantCulture olarak ayarlamayı denedim Ama hiçbir başarı elde etti:

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

Am I o kültür bilgi ile ilgisi var varsayalım, ya da ben pist dışında gerçekten çok olduğumda bile yakın? Nereden başlamalıyım diye bir fikri olan var mı? Ben geçici olarak istediğim davranışa sahip bir CultureInfo örneğini oluşturmam gerektiğini tahmin ediyorum, ancak yalnızca CompareInfo'a kadar gidenler var, Sort-Object'in CompareInfo.Compare fonksiyonunu nasıl yükleyeceğinden emin değilim. PowerShell işlevlerini kullanmayı gerektirir. Ya da bu etkili bir kayıp bir sebeptir, çünkü bu mümkün değil mi?

Düzenleme En azından

, XYZ, Xyz, xyz'yi YZ, YZ olduğu gibi ilk büyük karakterlerle sıralamak mümkün olurdu?

+1

'Sıra' ((http://stackoverflow.com/a/492885/2495 da [InvariantCulture ve Sıra dizge karşılaştırması arasındaki fark] bkz kendi kod noktası değerlerine dayanarak karakterleri karşılaştırır .NET karşılaştırmasıdır)). [Mitul'un cevabı] (http://stackoverflow.com/a/18544765/2495) ['[StringComparer] :: Ordinal'] ile (http://msdn.microsoft.com/en-us/library/system.stringcomparer) .ordinal.aspx) en iyi seçim gibi görünüyor. –

cevap

7

sort-object yöntemini değiştirmenin bir yolu olup olmadığını bulmak için çok uğraştım ancak çalışmıyor. Ama benzer bir şey bu msdn example gösterildiği gibi StringComparer statik sınıf kullanarak başardı.

At the very least, would it be possible to sort with uppercase characters first, as in XYZ, Xyz, xyz, YZ, yZ? 

[System.StringComparer]::InvariantCultureIgnoreCase

Cevabınız, son bölümünü cevaplamak için. Farklılıkları görmek için aşağıdaki tüm farklı sürümleri denedim.

$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

Çok titiz. Böyle bir şey yapmam gerekmeyeceğini umuyordum, ama görünüşe göre sıralama fikri, PowerShell'de bile oldukça sınırlı. Çok teşekkür ederim. –