并非显示所有属性

时间:2017-06-08 06:28:55

标签: arrays powershell properties

当我们尝试通过管道将数据导出到其他函数时,我们在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}}。

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/