2010-07-19 39 views
6

是否可以按屬性名稱對Format-List cmdlet的輸出進行排序?
假設我有一個對象$ X具有兩個屬性「A」和「B」,當我運行格式清單,我得到它格式 - 列表:按名稱排序屬性

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

我想有

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

注意:我應該從一開始就指定,與「A」和「B」屬性的例子不同,我必須處理的真實對象具有相當多的屬性,並且可以添加新屬性未來,所以我不提前知道所有的財產名稱。

回答

8

AFAIK,Format-List不提供這樣的選項。

爲了您的具體的例子可以這樣:

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

如果屬性集不固定/已知,那麼該程序將與使用Get-Member和一些預處理制定更棘手的排序參數數組Select-Object

編輯:

這是(讓我們使用$主機而不是$ X):

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

克里斯托弗是正確的,Select-Object不是絕對需要:

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

通過使用PowerShell命令別名,上面的答案可以縮短爲: '$ x | fl([string []]($ x | gm -m Property |%{$ _。Name} | sort))' – 2013-03-08 16:41:30

0

我確信你可以達到預期的輸出。我建議你同時使用Sort-Object(或簡單Sort)和Group-Object(普通組)來實驗

我的想法是將排序或組放在|格式列表

因此$ x | sort-object -property xyz |格式列表

+0

這種做法將根據該對象進行排序屬性xyz的值,但不會爲每個單獨的對象排序屬性。 – 2010-07-19 17:41:25

0

如果您正在處理少量屬性,則可以使用-Property參數指定它們的順序。

下面是一個例子:

Format-List -Property Owner, Path 

如果你有很多的屬性,我不知道有任何簡單的方法在格式列表,對它們進行排序像羅曼說。

3

我能想到的最接近的是創建一個基於關閉舊的新的psobject但與性質分類如:

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

你可以得到票友,並給新psobject,舊的匹配類型名一個等等

+0

我也喜歡這個解決方案... +1 – 2010-07-20 05:44:04

1

這似乎是工作正常(編輯所以它的管道輸入):

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

擴大對克里斯托弗的思想,採用get-memberformat-list -Property

$x | fl -property ($x| gm | sort name).name