2010-07-19 16 views
6

Ist es möglich, die Ausgabe des Cmdlets Format-List nach Eigenschaftennamen zu sortieren?
Nehmen wir an, ich ein Objekt $ x mit zwei Eigenschaften "A" und "B" haben, und wenn ich Format-List laufen mit ihm ichFormat-List: Eigenschaften nach Namen sortieren

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

Ich möchte

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

HINWEIS: Ich hätte von Anfang an spezifizieren sollen, dass, anders als im Beispiel mit den Eigenschaften "A" und "B", das reale Objekt, mit dem ich zu tun habe, ziemlich viele Eigenschaften hat und neue hinzugefügt werden können die Zukunft, also kenne ich nicht alle Immobiliennamen im Voraus.

Antwort

8

AFAIK, Format-List bietet keine solche Option.

Für Ihr spezielles Beispiel sollte diese Arbeit:

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

Wenn das Objekt nicht festgelegt/bekannt ist, dann wird das Verfahren mit Herstellung für Select-Object sortierte Parameterarray Verwendung von Get-Member und einiger Vorverarbeitung komplizierter sein.

EDIT:

Hier ist es (mal $ host statt $ x verwenden):

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

Christopher richtig ist, ist Select-Object nicht unbedingt erforderlich:

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

Mithilfe von PowerShell-Befehlsaliasen kann die obige Antwort wie folgt verkürzt werden: '$ x | fl ([string []] ($ x | gm -m Eigenschaft |% {$ _. Name} | sort)) ' –

0

Ich bin sicher, dass Sie die gewünschte Ausgabe erreichen können. Ich schlage vor, dass Sie sowohl mit Sort-Object (oder einfach Sort) als auch mit Group-Object (einfache Gruppe) experimentieren.

Meine Idee ist es, die Sortierung oder Gruppe vor | zu platzieren format-list

Also $ x | sort-object -property xyz | Format-Liste

+0

Dieser Ansatz die Objekte auf der Basis wird sortieren Wert der Eigenschaft xyz, aber es sortiert nicht die Eigenschaften für jedes einzelne Objekt. –

0

Wenn Sie mit einer kleinen Anzahl von Eigenschaften arbeiten, können Sie deren Reihenfolge mit dem Parameter -Property angeben.

Hier ein Beispiel:

Format-List -Property Owner, Path 

Wenn Sie eine Menge von Eigenschaften haben, bin ich nicht sicher, ob es eine einfache Möglichkeit besteht darin, sie in Format-List zu sortieren, wie die Römer.

3

Der nächstgelegene ich denken kann, ist eine neue psobject das alte zu schaffen, sondern mit den Eigenschaften basiert weg sortiert zB:

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

Sie könnten schicker erhalten und die neuen psobject eine Typnamen geben, der die alte Spiele eins usw.

+0

Ich mag diese Lösung auch ... +1 –

1

Dies scheint OK (bearbeitet, so dass es Pipelineeingaben akzeptiert) zu arbeiten:

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

auf Idee Christopher Aufweiten, get-member und format-list -Property mit:

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