¿Qué objetos son adecuados para Add-Member?
-
18-09-2019 - |
Pregunta
estados Documentación:
Agrega un miembro personalizado definido por el usuario una instancia de una de Windows PowerShell objeto.
Lo que "Windows PowerShell objeto" significa?
Esto funciona bien:
$obj = new-object system.object
$obj | add-member -membertype noteproperty -name Name -value "OK"
$obj.name
Pero esto no es así:
$obj = @{}
En realidad, estoy tratando de añadir una propiedad a $ error [0].
Solución
PowerShell tiene lo que se llama un PSObject que es una envoltura alrededor de cualquier objeto .NET (o puede ser un objeto totalmente personalizado) y cuando se llama Add-miembros, PowerShell está terminando implícitamente el objeto .NET real con un PSObject.
La forma en que funciona Add-miembro depende de si está o no empezar con un PSObject. Si usted no comenzó con un PSObject, Add-Miembro envolverá la entrada en un PSObject y se le tenga que volver a asignar a la variable con el fin de ver el objeto adaptado.
Así, por ejemplo:
$x = [Environment]::OSVersion
$x | Add-Member NoteProperty IsVista $true
$x | Format-List # does not show the new property
Esto se debe a que no se ajusta OSVersion es un PSObject. Añadir-miembro hace lo envuelve, sino que la envoltura se pierde porque no estás re-asignación de $ x para el objeto envuelto. Contrasta con este comportamiento:
$x = New-Object OperatingSystem ('Win32NT', '6.0')
$x | Add-Member NoteProperty IsVista $true
$x | Format-List # DOES show the new property
Esto se debe a New-Object envuelve implícitamente la nueva instancia en un PSObject. Así que su llamada Add-Member es la adición de miembros a la envoltura existente.
Volviendo al primer ejemplo, se puede hacer que funcione como se esperaba cambiándola a:
$x = [Environment]::OSVersion
$x = $x | Add-Member NoteProperty IsVista $true -PassThru
$x | Format-List # DOES show the new property
Ahora, después de todo eso, la razón por la que la tabla hash no funciona de la forma esperada es porque Hashtables son tratados especial por PowerShell y, básicamente, el adaptador de tablas hash utiliza las teclas como propiedades (un poco) y Add-miembros no funcionará como se espera con este tipo de objeto.