powershell - 两个列表中的格式表?
问题描述
我有这样的想法,即从 2 个单独的函数中获取输出,这些函数将 aPSCustomObject
作为list返回,并将它们格式化为一个表。我的问题很简单......我不知道该怎么做。哈哈
通过我尝试的各种组合,这给了我一些有希望的结果:
$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
推荐阅读
- github - 下载文件的最新版本
- awk - 获取匹配第二个模式的第一行的行号
- laravel - 如何使用 Unisharp laravel 文件管理器管理公共和私人文件?
- r - 将框和轴限制在 plot.raster 中的范围内
- sql - 查询应返回 sysdate @ 特定时间的结果
- android - 带有 LENGTH_LONG 的 Snackbar 的实际持续时间是多少
- android - 将参数发布到 API 的最佳方式是什么?
- grails - 如何从控制器响应/发送多个对象以在 grails 中查看?
- ios - 如何在 Xamarin iOS App 中启用定位服务
- c++ - 如何使用感知器对插值数据进行归一化?