两个列表中的格式-Table?
Format-Table out of Two Lists?
我有过从 2 个独立函数获取输出的想法,即 return a PSCustomObject
作为 list,并将它们格式化为一个 table。我的问题很简单......我不知道该怎么做。哈哈
通过我尝试的各种组合,以下是给了我一些有希望的结果的:
$Var1 = [PSCustomObject]@{
UserName = $env:USERNAME
Stuff1 = 'stuff1'
} | Format-List | Out-String -Stream
$Var2 = [PSCustomObject]@{
ComputerName = $env:COMPUTERNAME
Stuff2 = 'stuff2'
} | Format-List | Out-String -Stream
[PSCustomObject]@{
TableOne = $Var1.Trim().Foreach({$_})
TableTwo = $Var2.Trim()
} | Format-Table -AutoSize
输出:
TableOne TableTwo
-------- --------
{, , UserName : Abraham, Stuff1 : stuff1...} {, , ComputerName : DESKTOP-OEREJ77, Stuff2 : stuff2...}
我说有希望是因为它显示了 $var1
和 2 的实际内容,而我的其他尝试没有。我还将 .foreach()
运算符留在那里,以展示我试图使它正常工作的许多不同技巧之一。有那么一瞬间,我认为 Out-String
cmdlet 可以为我解决问题,但没有成功。
有没有人做过类似的事情?
编辑:
没关系,我想出来了。
使用 for
循环遍历每一行,一次分配给 PSCustomObject
一个。也用.Where()
运算符去掉空格,比较两个数组找出最大的数作为计数。
$Var1 = $([PSCustomObject]@{
UserName = $env:USERNAME
Stuff1 = 'stuff1'
} | Format-List | Out-String -Stream).Where{$_ -ne ''}
$Var2 = $([PSCustomObject]@{
ComputerName = $env:COMPUTERNAME
Stuff2 = 'stuff2'
ExtraStuff = 'More'
} | Format-List | Out-String -Stream).Where{$_ -ne ''}
$Count = ($Var1.Count, $Var2.Count | Measure-Object -Maximum).Maximum
$(for($i=0;$i -lt $Count; $i++) {
[PSCustomObject]@{
TableOne = $Var1[$i]
TableTwo = $Var2[$i]
}
}) | Format-Table -AutoSize
输出:
TableOne TableTwo
-------- --------
UserName : Abraham ComputerName : DESKTOP-OEREJ77
Stuff1 : stuff1 Stuff2 : stuff2
ExtraStuff : More
用相应的元素来格式化两个集合是一种有趣的方式。
要确实支持具有 多个 元素的两个集合,需要对您的方法进行一些调整:
# First collection, containing 2 sample objects.
$coll1 =
[PSCustomObject] @{
UserName = $env:USERNAME
Stuff1 = 'stuff1'
},
[PSCustomObject] @{
UserName = $env:USERNAME + '_2'
Stuff1 = 'stuff2'
}
# Second collection; ditto.
$coll2 =
[PSCustomObject] @{
ComputerName = $env:COMPUTERNAME
Stuff2 = 'stuff2'
ExtraStuff = 'More'
},
[PSCustomObject]@{
ComputerName = $env:COMPUTERNAME + '_2'
Stuff2 = 'stuff2_2'
ExtraStuff = 'More_2'
}
# Stream the two collections in tandem, and output a Format-List
# representation of each object in a pair side by side.
& {
foreach ($i in 0..([Math]::Max($coll1.Count, $coll2.Count) - 1)) {
[PSCustomObject] @{
TableOne = ($coll1[$i] | Format-List | Out-String).Trim() + "`n"
TableTwo = ($coll2[$i] | Format-List | Out-String).Trim() + "`n"
}
}
} | Format-Table -AutoSize -Wrap
以上确保多个对象正确地并排放置,并产生如下内容:
TableOne TableTwo
-------- --------
UserName : jdoe ComputerName : WS1
Stuff1 : stuff1 Stuff2 : stuff2
ExtraStuff : More
UserName : jdoe_2 ComputerName : WS1_2
Stuff1 : stuff2 Stuff2 : stuff2_2
ExtraStuff : More_2
我有过从 2 个独立函数获取输出的想法,即 return a PSCustomObject
作为 list,并将它们格式化为一个 table。我的问题很简单......我不知道该怎么做。哈哈
通过我尝试的各种组合,以下是给了我一些有希望的结果的:
$Var1 = [PSCustomObject]@{
UserName = $env:USERNAME
Stuff1 = 'stuff1'
} | Format-List | Out-String -Stream
$Var2 = [PSCustomObject]@{
ComputerName = $env:COMPUTERNAME
Stuff2 = 'stuff2'
} | Format-List | Out-String -Stream
[PSCustomObject]@{
TableOne = $Var1.Trim().Foreach({$_})
TableTwo = $Var2.Trim()
} | Format-Table -AutoSize
输出:
TableOne TableTwo
-------- --------
{, , UserName : Abraham, Stuff1 : stuff1...} {, , ComputerName : DESKTOP-OEREJ77, Stuff2 : stuff2...}
我说有希望是因为它显示了 $var1
和 2 的实际内容,而我的其他尝试没有。我还将 .foreach()
运算符留在那里,以展示我试图使它正常工作的许多不同技巧之一。有那么一瞬间,我认为 Out-String
cmdlet 可以为我解决问题,但没有成功。
有没有人做过类似的事情?
编辑: 没关系,我想出来了。
使用 for
循环遍历每一行,一次分配给 PSCustomObject
一个。也用.Where()
运算符去掉空格,比较两个数组找出最大的数作为计数。
$Var1 = $([PSCustomObject]@{
UserName = $env:USERNAME
Stuff1 = 'stuff1'
} | Format-List | Out-String -Stream).Where{$_ -ne ''}
$Var2 = $([PSCustomObject]@{
ComputerName = $env:COMPUTERNAME
Stuff2 = 'stuff2'
ExtraStuff = 'More'
} | Format-List | Out-String -Stream).Where{$_ -ne ''}
$Count = ($Var1.Count, $Var2.Count | Measure-Object -Maximum).Maximum
$(for($i=0;$i -lt $Count; $i++) {
[PSCustomObject]@{
TableOne = $Var1[$i]
TableTwo = $Var2[$i]
}
}) | Format-Table -AutoSize
输出:
TableOne TableTwo
-------- --------
UserName : Abraham ComputerName : DESKTOP-OEREJ77
Stuff1 : stuff1 Stuff2 : stuff2
ExtraStuff : More
用相应的元素来格式化两个集合是一种有趣的方式。
要确实支持具有 多个 元素的两个集合,需要对您的方法进行一些调整:
# First collection, containing 2 sample objects.
$coll1 =
[PSCustomObject] @{
UserName = $env:USERNAME
Stuff1 = 'stuff1'
},
[PSCustomObject] @{
UserName = $env:USERNAME + '_2'
Stuff1 = 'stuff2'
}
# Second collection; ditto.
$coll2 =
[PSCustomObject] @{
ComputerName = $env:COMPUTERNAME
Stuff2 = 'stuff2'
ExtraStuff = 'More'
},
[PSCustomObject]@{
ComputerName = $env:COMPUTERNAME + '_2'
Stuff2 = 'stuff2_2'
ExtraStuff = 'More_2'
}
# Stream the two collections in tandem, and output a Format-List
# representation of each object in a pair side by side.
& {
foreach ($i in 0..([Math]::Max($coll1.Count, $coll2.Count) - 1)) {
[PSCustomObject] @{
TableOne = ($coll1[$i] | Format-List | Out-String).Trim() + "`n"
TableTwo = ($coll2[$i] | Format-List | Out-String).Trim() + "`n"
}
}
} | Format-Table -AutoSize -Wrap
以上确保多个对象正确地并排放置,并产生如下内容:
TableOne TableTwo
-------- --------
UserName : jdoe ComputerName : WS1
Stuff1 : stuff1 Stuff2 : stuff2
ExtraStuff : More
UserName : jdoe_2 ComputerName : WS1_2
Stuff1 : stuff2 Stuff2 : stuff2_2
ExtraStuff : More_2