2010-07-19 11 views
6

¿Es posible ordenar el resultado del cmdlet Format-List por nombre de propiedad?
Supongamos que tengo un objeto $ x con dos propiedades "A" y "B", y cuando corro Format-List con él puedo obtenerFormat-List: ordenar propiedades por nombre

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

me gustaría tener

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

NOTA: Debería haber especificado desde el principio que, a diferencia del ejemplo con las propiedades "A" y "B", el objeto real con el que tengo que lidiar tiene bastantes propiedades y se podrían agregar nuevas en el futuro, así que no sé todos los nombres de las propiedades de antemano.

Respuesta

8

AFAIK, Format-List no proporciona esta opción.

Para su ejemplo particular, esto debería funcionar:

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

Si el conjunto de propiedades no es fijo/conocido entonces el procedimiento será más complicado con el uso de Get-Member y un poco de toma de pre-procesamiento ordenados matriz de parámetros para Select-Object.

EDIT:

Aquí está (vamos a utilizar $ host en lugar de $ x):

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

Christopher es correcto, Select-Object no es absolutamente necesario:

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

Al usar los alias de comando de PowerShell, la respuesta anterior se puede acortar a: '$ x | fl ([string []] ($ x | gm -m Property |% {$ _. Name} | sort)) ' –

0

Estoy seguro de que puede lograr la salida deseada. Sugiero que experimente con Sort-Object (o plain Sort) y también Group-Object (plain group)

Mi idea es colocar el género o grupo antes | lista de formatos

Así $ x | sort-object -property xyz | Format-List

+0

Este enfoque va a clasificar los objetos en función de la valor de la propiedad xyz pero no ordenará las propiedades para cada objeto individual. –

0

Si está tratando con un pequeño número de propiedades, puede especificar su orden con el parámetro -Property.

Aquí está un ejemplo:

Format-List -Property Owner, Path 

Si usted tiene un montón de propiedades, no estoy seguro de que hay alguna forma fácil de ordenarlos en formato de lista, como dijo Romano.

3

Lo más cerca que puedo pensar es crear un nuevo psobject sede fuera la antigua pero con las propiedades ordenados por ejemplo:

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

Usted podría conseguir más elegante y dar a la nueva psobject un nombre de tipo que coincide con la edad uno, etc.

+0

Me gusta esta solución también ... +1 –

1

Esto parece funcionar bien (editado por lo que acepta entradas de canalización):

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

Ampliando la idea de Christopher, utilizando get-member y format-list -Property:

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