格式-Table -GroupBy 在一行中显示数组属性
Format-Table -GroupBy displaying array property on a single line
我正在创建一个具有两个属性的自定义对象。第一个是字符串,基本上是一个键,第二个是 returns 数组的函数输出。然后我将结果传输到 Format-Table 并按字符串 属性 分组。我想看到的是数组 属性 的每个元素在输出的单独行中。相反,Format-Table 在一行中显示数组。
是否有任何格式化输出的方法,以便数组 属性 的每个元素显示在单独的行中?
下面是一些说明问题的代码:
function Get-Result([string]$lookup)
{
if ($lookup -eq "first")
{
return @("one", "two")
}
else
{
return @("three")
}
}
$a = "first", "second"
$a |
Select-Object @{Name="LookupValue"; Expression={$_}}, `
@{Name="Result"; Expression={Get-Result $_}} |
Format-Table -GroupBy LookupValue
这是它的输出:
LookupValue: first
LookupValue Result
----------- ------
first {one, two}
LookupValue: second
LookupValue Result
----------- ------
second three
我想看的是:
LookupValue: first
LookupValue Result
----------- ------
first one
first two
LookupValue: second
LookupValue Result
----------- ------
second three
获得它的一种方法 -
function Get-Result([string]$lookup) {
if ($lookup -eq "first") {
Write-Output @(
@{ LookupValue=$lookup; Result="one" },
@{ LookupValue=$lookup; Result="two" }
)
}
else {
Write-Output @(
@{ LookupValue=$lookup; Result="three" }
)
}
}
"first", "second" | % { Get-Result($_) } | % { [PSCustomObject]$_ } | Format-Table LookupValue, Result -GroupBy LookupValue
输出:
LookupValue: first
LookupValue Result
----------- ------
first one
first two
LookupValue: second
LookupValue Result
----------- ------
second three
Format-cmdlets
不会创建不存在的对象。您的示例有一个包含数组的结果值。如果您不希望它成为一个数组而是两个不同对象的一部分,那么您需要以某种方式将其拆分 或 更改您的创建过程以制作这些 multiple/missing 对象。
前者通过添加另一个处理多个"results"
的内部循环
$a | ForEach-Object{
$element = $_
Get-Result $element | ForEach-Object{
$_ | Select-Object @{Name="LookupValue"; Expression={$element}},
@{Name="Result"; Expression={$_}}
}
} | Format-Table -GroupBy LookupValue
因此,对于 Get-Result
的每个输出,都会创建一个新对象,引用管道中的当前 LookupValue
,由 $element
表示。
这有点笨拙,所以我还想添加一个我们改变您的创建过程的阶梯示例
function Get-Result{
param(
[Parameter(
ValueFromPipeline)]
[string]$lookup
)
process{
switch($lookup){
"first"{
[pscustomobject]@{LookupValue=$lookup;Result="one"},
[pscustomobject]@{LookupValue=$lookup;Result="two"}
}
default{
[pscustomobject]@{LookupValue=$lookup;Result="three"}
}
}
}
}
$a = "first", "second"
$a | Get-Result | Format-Table -GroupBy LookupValue
创建一个接受管道输入并根据 $lookup
吐出 pscustomobjects 的函数。我在这里使用了一个开关,以防你的实际应用有比你在示例中显示的更多的条件。
备注
为了 -GroupBy
工作,数据集应该被排序。因此,如果您遇到真实数据无法正确显示的问题......请先对其进行排序。
我正在创建一个具有两个属性的自定义对象。第一个是字符串,基本上是一个键,第二个是 returns 数组的函数输出。然后我将结果传输到 Format-Table 并按字符串 属性 分组。我想看到的是数组 属性 的每个元素在输出的单独行中。相反,Format-Table 在一行中显示数组。
是否有任何格式化输出的方法,以便数组 属性 的每个元素显示在单独的行中?
下面是一些说明问题的代码:
function Get-Result([string]$lookup)
{
if ($lookup -eq "first")
{
return @("one", "two")
}
else
{
return @("three")
}
}
$a = "first", "second"
$a |
Select-Object @{Name="LookupValue"; Expression={$_}}, `
@{Name="Result"; Expression={Get-Result $_}} |
Format-Table -GroupBy LookupValue
这是它的输出:
LookupValue: first
LookupValue Result
----------- ------
first {one, two}
LookupValue: second
LookupValue Result
----------- ------
second three
我想看的是:
LookupValue: first
LookupValue Result
----------- ------
first one
first two
LookupValue: second
LookupValue Result
----------- ------
second three
获得它的一种方法 -
function Get-Result([string]$lookup) {
if ($lookup -eq "first") {
Write-Output @(
@{ LookupValue=$lookup; Result="one" },
@{ LookupValue=$lookup; Result="two" }
)
}
else {
Write-Output @(
@{ LookupValue=$lookup; Result="three" }
)
}
}
"first", "second" | % { Get-Result($_) } | % { [PSCustomObject]$_ } | Format-Table LookupValue, Result -GroupBy LookupValue
输出:
LookupValue: first
LookupValue Result
----------- ------
first one
first two
LookupValue: second
LookupValue Result
----------- ------
second three
Format-cmdlets
不会创建不存在的对象。您的示例有一个包含数组的结果值。如果您不希望它成为一个数组而是两个不同对象的一部分,那么您需要以某种方式将其拆分 或 更改您的创建过程以制作这些 multiple/missing 对象。
前者通过添加另一个处理多个"results"
的内部循环$a | ForEach-Object{
$element = $_
Get-Result $element | ForEach-Object{
$_ | Select-Object @{Name="LookupValue"; Expression={$element}},
@{Name="Result"; Expression={$_}}
}
} | Format-Table -GroupBy LookupValue
因此,对于 Get-Result
的每个输出,都会创建一个新对象,引用管道中的当前 LookupValue
,由 $element
表示。
这有点笨拙,所以我还想添加一个我们改变您的创建过程的阶梯示例
function Get-Result{
param(
[Parameter(
ValueFromPipeline)]
[string]$lookup
)
process{
switch($lookup){
"first"{
[pscustomobject]@{LookupValue=$lookup;Result="one"},
[pscustomobject]@{LookupValue=$lookup;Result="two"}
}
default{
[pscustomobject]@{LookupValue=$lookup;Result="three"}
}
}
}
}
$a = "first", "second"
$a | Get-Result | Format-Table -GroupBy LookupValue
创建一个接受管道输入并根据 $lookup
吐出 pscustomobjects 的函数。我在这里使用了一个开关,以防你的实际应用有比你在示例中显示的更多的条件。
备注
为了 -GroupBy
工作,数据集应该被排序。因此,如果您遇到真实数据无法正确显示的问题......请先对其进行排序。