是否可以按属性名称对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”属性的示例不同,我必须处理的真实对象具有相当多的属性,未来可能会添加新的,所以我事先并不知道所有的属性名称。
答案 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-member
和format-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