当我们尝试通过管道将数据导出到其他函数时,我们在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
}的对象将是{{1}}中的第一个。{1}}。
答案 0 :(得分:5)
我曾经有过相同的经历并创建了以下可重复使用的“Union
”功能:
Function Union {
$Union = @()
$Input | ForEach {
If ($Union.Count) {$_ | Get-Member | Where {!($Union[0] | Get-Member $_.Name)} | ForEach {$Union[0] | Add-Member NoteProperty $_.Name $Null}}
$Union += $_
}
$Union
}
用法:
$Obj1, $Obj2 | Union | Out-GridView -Title 'Showing all members'
它也应该与复杂的对象一起使用。某些标准cmdlet一次输出多个对象类型,如果您查看它们(例如Out-GridView
)或将它们转储到文件中(例如Export-Csv
),您可能会错过很多属性。再举一个例子:
Get-WmiObject -Namespace root/hp/instrumentedBIOS -Class hp_biosSetting | Union | Export-Csv ".\HPBIOS.csv"
已添加2014-09-19:
可能这已经在评论$Array | Select * | …
中的行之间,但不会解决问题,而是专门选择属性$Array | Select Member1, Member2, Member3 | …
。
此外,虽然在大多数情况下Union
函数都可以使用,但是有一些例外,因为它只会将第一个对象与其余对象对齐。
请考虑以下对象:
$List = @(
New-Object PSObject -Property @{Id = 2}
New-Object PSObject -Property @{Id = 1}
New-Object PSObject -Property @{Id = 3; Name = "Test"}
)
如果您Union
此对象的一切似乎都很好,如果您是<{1}}从那时开始使用ExportTo-CSV
文件就不会有任何问题。
export .csv
仍有一个问题,因为只有第一个对象对齐。如果你是在$List | Union
Id Name
-- ----
2
1
3 Test
(Id
)上排序结果或仅取最后2个(Sort Id
)条目,未列出Select -Last 2
,因为第二个对象不包含{ {1}}属性:
Name
因此我重写了Name
(别名$List | Union | Sort Id
Id
--
1
2
3
)函数`):
Union-Object
<强>语法:强>
Union
有关最新的Function Union-Object ([String[]]$Property = @()) { # Version 00.02.01, by iRon
$Objects = $Input | ForEach {$_}
If (!$Property) {ForEach ($Object in $Objects) {$Property += $Object.PSObject.Properties | Select -Expand Name}}
$Objects | Select ([String[]]($Property | Select -Unique))
} Set-Alias Union Union-Object
版本,请参阅:https://powersnippets.com/union-object/