2010-07-19 4 views
6

Est-il possible de trier la sortie de la cmdlet Format-List par nom de propriété?
Supposons que j'ai un x $ objet avec deux propriétés « A » et « B », et quand je lance Format-List avec elle-je obtenirFormat-List: trier les propriétés par nom

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

Je voudrais avoir

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

NOTE: J'ai indiqué dès le début que, contrairement à l'exemple « a » et les propriétés « B », le vrai objet que je dois traiter a beaucoup de propriétés et de nouvelles pourraient être ajoutées l'avenir, donc je ne connais pas tous les noms de propriété à l'avance.

Répondre

8

AFAIK, Format-List ne fournit pas une telle option.

Pour votre exemple particulier cela devrait fonctionner:

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

Si l'ensemble de la propriété est pas fixe/connue, la procédure sera plus délicate avec l'utilisation de Get-Member et d'autres la fabrication de pré-traitement tableau de paramètres triés pour Select-Object.

EDIT:

Ici, il est (Utilisons hôte $ au lieu de $ x):

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

Christopher est juste, Select-Object est pas absolument nécessaire:

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

En utilisant les alias de commande PowerShell, la réponse ci-dessus peut être raccourcie à: '$ x | fl ([chaîne []] ($ x | gm -m Propriété |% {$ _. Nom} | sort)) ' –

0

Je suis sûr que vous pouvez atteindre la sortie désirée. Je vous suggère d'expérimenter à la fois Sort-Object (ou Tri plaine) et du Groupe d'objets aussi (groupe ordinaire)

Mon idée est de placer le genre, ou d'un groupe avant | format-list

Ainsi $ x | trier-objet -property xyz | Format-List

+0

Cette approche triera les objets en fonction de la valeur de la propriété xyz mais ne triera pas les propriétés pour chaque objet individuel. –

0

Si vous traitez un petit nombre de propriétés, vous pouvez spécifier leur ordre avec le paramètre -Property.

Voici un exemple:

Format-List -Property Owner, Path 

Si vous avez beaucoup de propriétés, je ne suis pas sûr qu'il ya un moyen facile de les trier Format-List, comme l'a dit Roman.

3

Le plus proche que je peux penser est de créer un nouveau psobject basé sur l'ancien mais avec les propriétés triées par exemple:

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

Vous pourriez obtenir colombophile et de donner la nouvelle psobject un typename qui correspond à l'ancien un, etc.

+0

J'aime cette solution aussi ... +1 –

1

Cela semble fonctionner OK (modifié de sorte qu'il accepte l'entrée de pipeline):

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

expansion sur l'idée de Christopher, en utilisant get-member et format-list -Property:

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