Format-List:按名称排序属性

时间:2010-07-19 14:29:49

标签: sorting powershell

是否可以按属性名称对Format-List cmdlet的输出进行排序?
假设我有一个带有两个属性“A”和“B”的对象$ x,当我运行Format-List时,我得到了

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

我想

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

注意:我应该从一开始就指出,与具有“A”和“B”属性的示例不同,我必须处理的真实对象具有相当多的属性,未来可能会添加新的,所以我事先并不知道所有的属性名称。

8 个答案:

答案 0 :(得分:9)

AFAIK,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

Christopher 是对的,Select-Object并非绝对需要:

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

答案 1 :(得分:3)

我能想到的最接近的是创建一个基于旧的psobject的新psobject,但其属性已经排序,例如:

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

你可以变得更有魅力,给新的psobject一个与旧的匹配的类型名称等。

答案 2 :(得分:2)

使用get-memberformat-list -Property

扩展克里斯托弗的想法
$x | fl -property ($x| gm | sort name).name

答案 3 :(得分:1)

如果您正在处理少量属性,可以使用-Property参数指定它们的顺序。

以下是一个例子:

Format-List -Property Owner, Path

如果你有很多属性,我不确定是否有任何简单的方法可以在Format-List中对它们进行排序,就像Roman说的那样。

答案 4 :(得分: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

答案 5 :(得分:0)

我确信您可以实现所需的输出。我建议您尝试使用Sort-Object(或普通排序)和Group-Object(普通组)

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

因此$ x | sort-object -property xyz |格式列表

答案 6 :(得分:0)

接受的答案没什么问题,但是一个真的一次性快捷选项—不需要已经在变量中包含集合—可能是...

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

...在Format-List输出的每一行上进行排序。

请注意,进入下一行的所有属性值都将被破坏(并可能出现在输出的顶部),但这可以通过稍显难忘的方式来解决...

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

...以列缩进为代价。

当然,所有对象/管道信息都会因该Out-String调用而丢失,尽管考虑到Format-List也是如此,但是到那时您可能会不在乎。

答案 7 :(得分:0)

通过将<link rel="stylesheet" href="/vendor/nucleo/css/nucleo.css"> 与计算所得的属性(Select-Object)一起使用,然后将其排除(@{}),您还可以根据需要对属性进行排序。即使您不知道即将发生的事情,此方法也有效。

-ExcludeProperty

输出:

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