【发布时间】:2017-06-08 06:28:54
【问题描述】:
当我们尝试通过管道将数据导出到其他函数时,我们在 PowerShell 中观察到一些奇怪的行为。
示例代码:
$Array = @()
$Obj1 = [PSCustomObject]@{
Member1 = 'First'
Member2 = 'Second'
}
$Obj2 = [PSCustomObject]@{
Member1 = 'First'
Member2 = 'Second'
Member3 = 'Third'
}
$Array = $Obj1, $Obj2
$Array | Out-GridView -Title 'Not showing Member3'
$Array = $Obj2, $Obj1
$Array | Out-GridView -Title 'All members correctly displayed'
在上面的示例中,您可以看到当第一个对象仅包含 2 个properties 时,Out-GridView CmdLet(和其他)仅显示 2 个properties,即使第二个对象具有 3 个properties。但是,当数组中的第一个对象有 3 个 properties 时,它确实会正确显示它们。
有没有办法解决这个问题?因为无法预先预测一个对象上有多少个properties,以及拥有最多properties 的对象是否会是array 中的第一个。
【问题讨论】:
-
"因为不可能从一个对象上有多少属性来预测" - 嗯..是的,你控制对象是什么,你控制您放入其中的属性。它们不是随机的..在每个对象上选择你想要的,然后它就会起作用..
-
没错,但问题是我的代码会根据某些逻辑生成额外的比例。所以有些对象只有 2 个,而其他对象可能有 15 个 ..
-
我认为,powershell 只是认为
alright, I can predict [PSCustomObjects] with same props are coming - lets stop looking at it after the first one。您应该能够以相同的方式设置所有对象。从技术上讲,您返回了一个[ADUser对象和一个[DateTime]并且对结果很奇怪感到惊讶。 -
"没错,但问题是我的代码会根据某些逻辑生成额外的比例。所以有些对象只有 2 个,而其他对象可能有 15 个。" - 你可以告诉这个这是一个糟糕的设计,因为它不能很好地工作。 :-|数据模型具有您关心的字段,如果一个实例对该字段没有值,则将该值留空。例如在 CSV 中,您可以将某列连续留空,但不能从一行中取出一列,否则整个 CSV 会中断。
-
This 是生成属性的函数。你可以看到它从一开始就不知道会有多少属性。如果这是糟糕的设计,我必须重新考虑最后如何添加空属性。类似
$Array | ForEach-Object {$_.PSObject.Properties.Name} | Sort-Object -Unique
标签: arrays powershell properties unify