代码之家  ›  专栏  ›  技术社区  ›  Paolo Tedesco

格式列表:按名称对属性排序

  •  7
  • Paolo Tedesco  · 技术社区  · 14 年前

    是否可以按属性名对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”属性的示例不同,我必须处理的实际对象具有相当多的属性,将来可能会添加新的属性,因此我不知道所有属性的名称。

    6 回复  |  直到 11 年前
        1
  •  9
  •   Roman Kuzmin    14 年前

    嗯, Format-List 不提供此类选项。

    对于您的特定示例,这应该有效:

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

    如果属性集不是固定的/已知的,那么使用 Get-Member 和一些预处理使排序参数数组 Select-Object .

    编辑:

    这里是(让我们使用$host而不是$x):

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

    克里斯托弗 是正确的, 选择对象 不是绝对需要的:

    $host | Format-List ([string[]]($host | Get-Member -MemberType Property | %{ $_.Name } | Sort-Object))
    
        2
  •  3
  •   Keith Hill    14 年前

    我能想到的最接近的方法是基于旧的PSObject创建一个新的PSObject,但对属性进行排序,例如:

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

    你可以变得更漂亮,给新的PSObject一个与旧的相匹配的类型名,等等。

        3
  •  2
  •   senshin    11 年前

    扩展克里斯托弗的想法,使用 get-member format-list -Property :

    $x | fl -property ($x| gm | sort name).name
    
        4
  •  1
  •   Christopher    14 年前

    如果处理的是少量属性,则可以使用-property参数指定它们的顺序。

    下面是一个例子:

    Format-List -Property Owner, Path
    

    如果您有很多属性,我不确定是否有任何简单的方法可以在格式列表中对它们进行排序,如Roman所说。

        5
  •  1
  •   George Howarth    14 年前

    这似乎工作正常(编辑后接受管道输入):

    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
    
        6
  •  0
  •   Guy Thomas    14 年前

    我相信你能达到预期的产量。我建议您尝试使用排序对象(或普通排序)和分组对象(普通分组)

    我的想法是将排序或分组放在格式列表之前

    因此$X排序对象-属性XYZ格式列表