recorrer propiedades obtener objetos objeto lista imprimir elementos atributos array agregar arrays powershell properties

arrays - obtener - No se muestran todas las propiedades



propiedades javascript (1)

Cuando intentamos exportar datos a otras funciones a través de la canalización, observamos un comportamiento extraño en PowerShell.

Código de ejemplo:

$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''

En el ejemplo anterior, puede ver que cuando el primer objeto solo contiene 2 properties , el CmdLet Out-GridView (y otros) solo muestra 2 properties , aunque el segundo objeto tiene 3 properties . Sin embargo, cuando el primer objeto de la matriz tiene 3 properties , las muestra todas correctamente.

¿Hay alguna forma de evitar esto? Debido a que no es posible predecir por adelantado cuántas properties habrá en un objeto y si el objeto con más properties será el primero en la array .


Tuve la misma experiencia una vez y creé la siguiente función reutilizable '' 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 }

Uso:

$Obj1, $Obj2 | Union | Out-GridView -Title ''Showing all members''

También se supone que funciona con objetos complejos. Algunos cmdlets estándar generan varios tipos de objetos a la vez y si los ve (por ejemplo, Out-GridView ) o los volca en un archivo (por ejemplo, Export-Csv ) puede perder muchas propiedades. Toma como otro ejemplo:

Get-WmiObject -Namespace root/hp/instrumentedBIOS -Class hp_biosSetting | Union | Export-Csv "./HPBIOS.csv"

Añadido 2014-09-19:

Quizás esto ya esté entre líneas en los comentarios $Array | Select * | … $Array | Select * | … $Array | Select * | … no resolverá el problema, sino que seleccionará específicamente las propiedades $Array | Select Member1, Member2, Member3 | … $Array | Select Member1, Member2, Member3 | … $Array | Select Member1, Member2, Member3 | … hace.
Además, aunque en la mayoría de los casos la función Union funcionará, hay algunas excepciones, ya que solo alineará el primer objeto con el resto. Considere el siguiente objeto:

$List = @( New-Object PSObject -Property @{Id = 2} New-Object PSObject -Property @{Id = 1} New-Object PSObject -Property @{Id = 3; Name = "Test"} )

Si ExportTo-CSV este objeto, todo parece estar bien y si, por ejemplo, ExportTo-CSV y trabaja con el archivo de export .csv partir de ese momento, nunca tendrá ningún problema.

$List | Union Id Name -- ---- 2 1 3 Test

Todavía hay un problema ya que solo el primer objeto está alineado. Si, por ejemplo, ordena el resultado en Id ( Sort Id ) o toma solo las últimas 2 entradas ( Select -Last 2 ), el Name no aparece porque el segundo objeto no contiene la propiedad Name :

$List | Union | Sort Id Id -- 1 2 3

Por lo tanto, he reescrito la función Union-Object (Alias Union ) ''):

Objeto de unión

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

Sintaxis:

$Array | Union | Out-GridView -Title ''All members correctly displayed''

Para la última versión de Union-Object , consulte: https://powersnippets.com/union-object/