2010-07-19 44 views
6

Có thể sắp xếp đầu ra của lệnh Định dạng-Liệt kê theo tên thuộc tính không?
Giả sử rằng tôi có một đối tượng $ x với hai thuộc tính "A" và "B", và khi tôi chạy Format-List với nó tôi nhận đượcĐịnh dạng-Danh sách: sắp xếp các thuộc tính theo tên

(PS) > $x | Format-List 
B : value b 
A : value a 

Tôi muốn có

(PS) > $x | Format-List 
A : value a 
B : value b 

CHÚ Ý: Tôi đã xác định ngay từ đầu, không giống như trong ví dụ với thuộc tính "A" và "B", đối tượng thực mà tôi phải xử lý có khá nhiều thuộc tính và những thuộc tính mới có thể được thêm vào tương lai, vì vậy tôi không biết trước tất cả các tên thuộc tính.

Trả lời

8

AFAIK, Format-List không cung cấp tùy chọn như vậy.

Ví dụ cụ thể của bạn này nên làm việc:

$x | Select-Object A, B | Format-List 

Nếu tập bất động sản chưa được khắc phục/biết thì thủ tục sẽ được khôn lanh hơn với việc sử dụng Get-Member và một số làm tiền xử lý sắp xếp mảng tham số cho Select-Object.

EDIT:

Ở đây nó được (chúng ta hãy sử dụng $ host thay vì $ x):

$host | Select-Object ([string[]]($host | Get-Member -MemberType Property | %{ $_.Name } | Sort-Object)) | Format-List 

Christopher là đúng, Select-Object không hoàn toàn cần thiết:

$host | Format-List ([string[]]($host | Get-Member -MemberType Property | %{ $_.Name } | Sort-Object)) 
+0

Bằng cách sử dụng bí danh lệnh PowerShell, câu trả lời ở trên có thể được rút ngắn thành: '$ x | fl ([string []] ($ x | gm -m Thuộc tính |% {$ _. Name} | sắp xếp)) ' –

0

Tôi cảm thấy chắc chắn rằng bạn có thể đạt được kết quả mong muốn. Tôi khuyên bạn nên thử nghiệm với cả hai đối tượng sắp xếp (hoặc sắp xếp đơn giản) và cả nhóm đối tượng (nhóm đồng bằng)

Ý tưởng của tôi là đặt sắp xếp hoặc nhóm trước | định dạng danh sách

Vì vậy, $ x | sort-object -property xyz | Định dạng-Danh sách

+0

Cách tiếp cận này sẽ sắp xếp các đối tượng dựa trên giá trị của thuộc tính xyz nhưng nó sẽ không sắp xếp các poperties cho từng đối tượng riêng lẻ. –

0

Nếu bạn đang xử lý một số lượng nhỏ các thuộc tính, bạn có thể chỉ định thứ tự của chúng với tham số -Property.

Dưới đây là một ví dụ:

Format-List -Property Owner, Path 

Nếu bạn có rất nhiều tài sản, tôi không chắc chắn có cách nào dễ dàng để sắp xếp chúng trong danh sách định dạng, như La Mã nói.

3

Gần nhất tôi có thể nghĩ đến là tạo ra một psobject mới dựa trên cái cũ một nhưng với các thuộc tính được sắp xếp ví dụ:

$x | %{$obj = new-object psobject; ` 
     $_.psobject.properties | Sort Name | ` 
      %{Add-Member -Inp $obj NoteProperty $_.Name $_.Value}; $obj} | fl 

Bạn có thể nhận được fancier và cung cấp cho các psobject mới một typename phù hợp với người già một, v.v.

+0

Tôi thích giải pháp này quá ... +1 –

1

Điều này dường như làm việc OK (sửa nên nó chấp nhận đường ống đầu vào):

function Format-SortedList 
{ 
    param (
     [Parameter(ValueFromPipeline = $true)] 
     [Object]$InputObject, 
     [Parameter(Mandatory = $false)] 
     [Switch]$Descending 
    ) 

    process 
    { 
     $properties = $InputObject | Get-Member -MemberType Properties 

     if ($Descending) { 
      $properties = $properties | Sort-Object -Property Name -Descending 
     } 

     $longestName = 0 
     $longestValue = 0 

     $properties | ForEach-Object { 
      if ($_.Name.Length -gt $longestName) { 
       $longestName = $_.Name.Length 
      } 

      if ($InputObject."$($_.Name)".ToString().Length -gt $longestValue) { 
       $longestValue = $InputObject."$($_.Name)".ToString().Length * -1 
      } 
     } 

     Write-Host ([Environment]::NewLine) 

     $properties | ForEach-Object { 
      Write-Host ("{0,$longestName} : {1,$longestValue}" -f $_.Name, $InputObject."$($_.Name)".ToString()) 
     } 
    } 
} 

$Host, $MyInvocation | Format-SortedList 
$Host, $MyInvocation | Format-SortedList -Descending 
1

Mở rộng trên ý tưởng của Christopher, sử dụng get-memberformat-list -Property:

$x | fl -property ($x| gm | sort name).name 
Các vấn đề liên quan