2010-07-19 51 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