Khi làm việc với một ổ đĩa được ánh xạ tới một chia sẻ Linux, tên tệp phân biệt chữ hoa chữ thường. PowerShell xử lý như mong đợi, nhưng tôi muốn sắp xếp đầu ra theo cách tương tự với thứ tự sắp xếp được sử dụng trong miền "C", có nghĩa là sắp xếp theo giá trị ký tự theo thứ tự tăng dần từ U + 0000 đến U + 10FFFF (ví dụ như '0foo' đi trước 'foo' và 'foo' đi trước 'bar' và 'bar' đi trước 'foo')Thay đổi hành vi sắp xếp đối tượng
Để minh họa cho vấn đề:
PS > gci Z:\foo | sort -casesensitive
xyz
Xyz
XYZ
yZ
YZ
Output mong muốn:
XYZ
Xyz
YZ
xyz
yZ
Tôi đã thử đặt biến văn hóa của chuỗi hiện tại thành [System.Globalization.CultureInfo]::InvariantCulture
, nhưng tôi đã không thành công:
$thrd = [Threading.Thread]::CurrentThread
$thrd.CurrentCulture = [Globalization.CultureInfo]::InvariantCulture
$thrd.CurrentUICulture = $thrd.CurrentCulture
Tôi thậm chí đóng khi tôi cho rằng nó có liên quan đến thông tin văn hóa hay tôi thực sự đi xa? Có ai có bất kỳ ý tưởng nơi tôi nên bắt đầu? Tôi đoán tôi cần phải tạm thời tạo ra một thể hiện CultureInfo có hành vi tôi mong muốn, nhưng nó chỉ có getters như xa như CompareInfo đi, chưa kể tôi không chắc chắn về cách quá tải các chức năng CompareInfo.Compare mà Sort-Object yêu cầu sử dụng chức năng PowerShell. Hay đây có phải là nguyên nhân bị mất vì điều đó là không thể?
Sửa
Ít nhất, nó sẽ có thể để sắp xếp với ký tự chữ hoa đầu tiên, như trong XYZ, xyz, xyz, YZ, YZ?
'Bình thường' là so sánh trong .NET so sánh các ký tự dựa trên giá trị điểm mã của chúng (xem thêm [Khác biệt giữa biến thể bất biến và so sánh chuỗi thông thường] (http://stackoverflow.com/a/492885/2495)). [Câu trả lời của Mitul] (http://stackoverflow.com/a/18544765/2495) với ['[StringComparer] :: Ordinal'] (http://msdn.microsoft.com/en-us/library/system.stringcomparer .ordinal.aspx) trông giống như sự lựa chọn tốt nhất. –