Format-List: sort properties by name

后端 未结 8 1976
一向
一向 2021-01-17 18:02

Is it possible to sort the output of the Format-List cmdlet by property name?
Suppose that I have an object $x with two properties \"A\" and \"B\", and when I run Format

相关标签:
8条回答
  • 2021-01-17 18:19

    Expanding on Christopher's idea, using get-member and format-list -Property:

    $x | fl -property ($x| gm | sort name).name
    
    0 讨论(0)
  • 2021-01-17 18:19

    This seems to work OK (edited so it accepts pipeline input):

    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
    
    0 讨论(0)
  • 2021-01-17 18:20

    Nothing wrong with the accepted answer, but a really quick-and-dirty option for a one-off—that doesn't require having the collection already in a variable—might be...

    ... | Format-List | Out-String -Stream | Sort-Object
    

    ...which does a sort on each line of the output of Format-List.

    Note that any property values that go onto the next line will be broken (and probably appear at the top of the output), but this could be fixed by the slightly-less-memorable...

    ... | Format-List | Out-String -Stream -Width ([Int32]::MaxValue) | Sort-Object
    

    ...at the expense of column indentation.

    Of course, all object/pipeline info is lost by that Out-String call, although—considering the same is true of Format-List—you probably aren't going to care by that point.

    0 讨论(0)
  • 2021-01-17 18:22

    The closest I can think of is to create a new psobject based off the old one but with the properties sorted e.g.:

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

    You could get fancier and give the new psobject a typename that matches the old one, etc.

    0 讨论(0)
  • 2021-01-17 18:23

    By using Select-Object with a calculated property (@{}) and then excluding it (-ExcludeProperty) you can also order the properties as you want. This works even when you don't know what's coming upfront.

    @(
        [PSCustomObject]@{
            Color   = 'Green'
            Type    = 'Fruit'
            Name    = 'kiwi'
            Flavour = 'Sweet'
        }
    ) | Select-Object @{Name = 'Flavour'; Expression = { $_.Flavour } },
    @{Name = 'Name'; Expression = { $_.Name } }, * -ExcludeProperty Name, Flavour |
    Format-List
    

    Output:

    Flavour : Sweet
    Name    : kiwi
    Color   : Green
    Type    : Fruit
    
    0 讨论(0)
  • 2021-01-17 18:31

    If you are dealing with a small number of properties, you can specify their order with the -Property parameter.

    Here is an example:

    Format-List -Property Owner, Path
    

    If you have a lot of properties, I am not sure there is any easy way to sort them in Format-List, like Roman said.

    0 讨论(0)
提交回复
热议问题