2009-04-28 16 views
6

estados Documentación:¿Qué objetos son adecuados para Add-Member?

agrega un miembro personalizado definido por el usuario a una instancia de un objeto Windows PowerShell.

¿Qué es "objeto Windows PowerShell"?

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].

Respuesta

16

PowerShell tiene lo que se llama un PSObject que es un envoltorio alrededor de cualquier objeto .NET (o puede ser un objeto totalmente personalizado) y cuando llama Add-Member, PowerShell implícitamente envuelve el objeto real .NET con un PSObject.

La manera en que Add-Member funciona depende de si comenzó con un objeto PSObject o no. Si no comenzó con un objeto PSO, Add-Member ajustará la entrada en un PSObject y tendrá que volver a asignar la variable para 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. Add-Member lo ajusta, pero ese contenedor se pierde porque no está reasignando $ x al objeto envuelto. Contraste 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 que New-Object envuelve implícitamente la nueva instancia en un objeto PSObject. Entonces, su llamada Add-Member agrega miembros al contenedor 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 Las tablas hash son tratadas de manera especial por PowerShell y, básicamente, el adaptador para Hashtables usa las claves como propiedades (un poco) y Add-Member no funcionará como se espera con este tipo de objeto.

+0

¡Gracias por la explicación! – alex2k8

Cuestiones relacionadas