Compartir a través de


Add-Member

Agrega propiedades y métodos personalizados a una instancia de un objeto de PowerShell.

Sintaxis

Add-Member
   -InputObject <PSObject>
   -TypeName <String>
   [-PassThru]
   [<CommonParameters>]
Add-Member
   -InputObject <PSObject>
   [-TypeName <String>]
   [-Force]
   [-PassThru]
   [-NotePropertyMembers] <IDictionary>
   [<CommonParameters>]
Add-Member
   -InputObject <PSObject>
   [-TypeName <String>]
   [-Force]
   [-PassThru]
   [-NotePropertyName] <String>
   [-NotePropertyValue] <Object>
   [<CommonParameters>]
Add-Member
   -InputObject <PSObject>
   [-MemberType] <PSMemberTypes>
   [-Name] <String>
   [[-Value] <Object>]
   [[-SecondValue] <Object>]
   [-TypeName <String>]
   [-Force]
   [-PassThru]
   [<CommonParameters>]

Description

El cmdlet Add-Member permite agregar miembros (propiedades y métodos) a una instancia de un objeto de PowerShell. Por ejemplo, puede agregar un miembro NoteProperty que contiene una descripción del objeto o un miembro ScriptMethod que ejecuta un script para cambiar el objeto.

Para usar , canalice el objeto para o use el parámetro inputObject de para especificar el objeto.

El parámetro MemberType indica el tipo de miembro que desea agregar. El parámetro Name asigna un nombre al nuevo miembro y el parámetro Value establece el valor del miembro.

Las propiedades y los métodos que agregue solo se agregan a la instancia concreta del objeto que especifique. Add-Member no cambia el tipo de objeto. Para crear un nuevo tipo de objeto, use el cmdlet Add-Type.

También puede usar el cmdlet Export-Clixml para guardar la instancia del objeto, incluidos los miembros adicionales, en un archivo. A continuación, puede usar el cmdlet Import-Clixml para volver a crear la instancia del objeto a partir de la información almacenada en el archivo exportado.

A partir de Windows PowerShell 3.0, Add-Member tiene nuevas características que facilitan la adición de propiedades de nota a objetos. Puede usar los parámetros NotePropertyName y NotePropertyValue para definir una propiedad note o usar el parámetro NotePropertyMembers, que toma una tabla hash de valores y nombres de propiedad de nota.

Además, a partir de Windows PowerShell 3.0, el parámetro PassThru, que genera un objeto de salida, se necesita con menos frecuencia. Add-Member ahora agrega los nuevos miembros directamente al objeto de entrada de más tipos. Para obtener más información, consulte la descripción del parámetro PassThru.

Ejemplos

Ejemplo 1: Agregar una propiedad note a un PSObject

En el ejemplo siguiente se agrega una propiedad status status con un valor "Done" al objeto fileInfo que representa el archivo .

El primer comando usa el cmdlet Get-ChildItem para obtener un objeto FileInfo que representa el archivo Test.txt. Lo guarda en la variable $a.

El segundo comando agrega la propiedad note al objeto en $a.

El tercer comando usa la notación de puntos para obtener el valor de la propiedad Status del objeto en . Como se muestra en la salida, el valor es Done.

$A = Get-ChildItem c:\ps-test\test.txt
$A | Add-Member -NotePropertyName Status -NotePropertyValue Done
$A.Status

Done

Ejemplo 2: Agregar una propiedad de alias a un PSObject

En el ejemplo siguiente se agrega una propiedad de alias size de al objeto que representa el archivo . La nueva propiedad es un alias para la propiedad Length.

El primer comando usa el cmdlet Get-ChildItem para obtener el Test.txtobjeto FileInfo.

El segundo comando agrega la propiedad Size alias. El tercer comando usa la notación de puntos para obtener el valor de la nueva propiedad Size.

$A = Get-ChildItem C:\Temp\test.txt
$A | Add-Member -MemberType AliasProperty -Name Size -Value Length
$A.Size

2394

Ejemplo 3: Agregar una propiedad stringUse note a una cadena

En este ejemplo se agrega la propiedad stringUse a una cadena. Dado que Add-Member no pueden agregar tipos a objetos de entrada string, puede especificar el parámetro PassThru para generar un objeto de salida. El último comando del ejemplo muestra la nueva propiedad.

En este ejemplo se usa el parámetro NotePropertyMembers. El valor del parámetro NotePropertyMembers es una tabla hash. La clave es el nombre de la propiedad note, StringUsey el valor es el valor de la propiedad note, Display.

$A = "A string"
$A = $A | Add-Member -NotePropertyMembers @{StringUse="Display"} -PassThru
$A.StringUse

Display

Ejemplo 4: Agregar un método de script a un objeto FileInfo

En este ejemplo se agrega el método de script SizeInMB a un objeto FileInfo que calcula el tamaño del archivo al megabyte más cercano. El segundo comando crea un scriptBlock de que usa el método estático round del tipo para redondear el tamaño del archivo al segundo decimal.

El parámetro Value también usa la variable automática $This, que representa el objeto actual. La variable $This solo es válida en bloques de script que definen nuevas propiedades y métodos.

El último comando usa la notación de puntos para llamar al nuevo método de script SizeInMB en el objeto de la variable $A.

$A = Get-ChildItem C:\Temp\test.txt
$S = {[math]::Round(($this.Length / 1MB), 2)}
$A | Add-Member -MemberType ScriptMethod -Name "SizeInMB" -Value $S
$A.SizeInMB()

0.43

Ejemplo 5: Crear un objeto personalizado

En este ejemplo se crea un Asset objeto personalizado.

El cmdlet crea un PSObject que se guarda en la variable . El acelerador de tipos [ordered] crea un diccionario ordenado almacenado en la variable $d. La canalización $Asset a Add-Member agrega los pares clave-valor del diccionario al objeto como miembros NoteProperty. parámetro TypeName asigna el tipo alPSObject de . El cmdlet Get-Member muestra el tipo y las propiedades del objeto. Sin embargo, las propiedades se enumeran en orden alfabético, no en el orden en que se agregaron.

$Asset = New-Object -TypeName PSObject
$d = [ordered]@{Name="Server30"; System="Server Core"; PSVersion="4.0"}
$Asset | Add-Member -NotePropertyMembers $d -TypeName Asset
$Asset | Get-Member -MemberType Properties

TypeName: Asset

Name        MemberType   Definition
----        ----------   ----------
Name        NoteProperty string Name=Server30
PSVersion   NoteProperty string PSVersion=4.0
System      NoteProperty string System=Server Core

$Asset.PSObject.Properties | Format-Table Name, MemberType, TypeNameOfValue, Value

Name        MemberType TypeNameOfValue Value
----        ---------- --------------- -----
Name      NoteProperty System.String   Server30
System    NoteProperty System.String   Server Core
PSVersion NoteProperty System.String   4.0

Al inspeccionar la lista sin procesar de propiedades se muestran las propiedades en el orden en que se agregaron al objeto . Format-Table se usa en este ejemplo para crear una salida similar a Get-Member.

Ejemplo 6: Agregar aliasProperty a un objeto

En este ejemplo se crea un objeto personalizado que contiene dos miembros NoteProperty. El tipo de un NoteProperty refleja el tipo del valor almacenado en la propiedad . En este caso, la propiedad Age es una cadena.

PS> $obj = [pscustomobject]@{
      Name = 'Doris'
      Age = '20'
}
PS> $obj | Add-Member -MemberType AliasProperty -Name 'intAge' -Value age -SecondValue uint32
PS> $obj | Get-Member

   TypeName: System.Management.Automation.PSCustomObject

Name        MemberType    Definition
----        ----------    ----------
intAge      AliasProperty intAge = (System.UInt32)age
Equals      Method        bool Equals(System.Object obj)
GetHashCode Method        int GetHashCode()
GetType     Method        type GetType()
ToString    Method        string ToString()
Age         NoteProperty  string Age=20
Name        NoteProperty  string Name=Doris

PS> $obj

Name  Age intAge
----  --- ------
Doris 20      20

PS> $obj.Age + 1

201

PS> $obj.intAge + 1

21

La propiedad intAge es un AliasProperty para la propiedad Age de , pero se garantiza que el tipo sea uint32.

Ejemplo 7: Adición de métodos get y set a un objeto personalizado

En este ejemplo se muestra cómo definir Get y Métodos Set que acceden a una propiedad profundamente anidada.

$user = [pscustomobject]@{
    Name      = 'User1'
    Age       = 29
    StartDate = [datetime]'2019-05-05'
    Position  = [pscustomobject]@{
        DepartmentName = 'IT'
        Role = 'Manager'
    }
}
$addMemberSplat = @{
    MemberType = 'ScriptProperty'
    Name = 'Title'
    Value = { $this.Position.Role }                  # getter
    SecondValue = { $this.Position.Role = $args[0] } # setter
}
$user | Add-Member @addMemberSplat
$user | Get-Member

TypeName: System.Management.Automation.PSCustomObject

Name        MemberType     Definition
----        ----------     ----------
Equals      Method         bool Equals(System.Object obj)
GetHashCode Method         int GetHashCode()
GetType     Method         type GetType()
ToString    Method         string ToString()
Age         NoteProperty   int Age=29
Name        NoteProperty   string Name=User1
Position    NoteProperty   System.Management.Automation.PSCustomObject Position=@{DepartmentName=IT; Role=Manager}
StartDate   NoteProperty   datetime StartDate=5/5/2019 12:00:00 AM
Title       ScriptProperty System.Object Title {get= $this.Position.Role ;set= $this.Position.Role = $args[0] ;}

$user.Title = 'Dev Manager'

Name      : User1
Age       : 29
StartDate : 5/5/2019 12:00:00 AM
Position  : @{DepartmentName=IT; Role=Dev Manager}
Title     : Dev Manager

Observe que la propiedad Title de es un ScriptProperty que tiene un Get y Método Set. Cuando asignamos un nuevo valor a la propiedad title de , se llama al método set y cambia el valor de la propiedad Role de en la propiedad Position.

Parámetros

-Force

De forma predeterminada, Add-Member no puede agregar un nuevo miembro si el objeto ya tiene un miembro con el mismo. Al usar el parámetro Force, Add-Member reemplaza el miembro existente por el nuevo miembro. No puede usar el parámetro Force para reemplazar un miembro estándar de un tipo.

Tipo:SwitchParameter
Posición:Named
Valor predeterminado:None
Requerido:False
Aceptar entrada de canalización:False
Aceptar caracteres comodín:False

-InputObject

Especifica el objeto al que se agrega el nuevo miembro. Escriba una variable que contenga los objetos, o escriba un comando o expresión que obtenga los objetos.

Tipo:PSObject
Posición:Named
Valor predeterminado:None
Requerido:True
Aceptar entrada de canalización:True
Aceptar caracteres comodín:False

-MemberType

Especifica el tipo del miembro que se va a agregar. Este parámetro es obligatorio. Los valores aceptables para este parámetro son:

  • AliasProperty
  • CodeMethod
  • CodeProperty
  • NoteProperty
  • ScriptMethod
  • ScriptProperty

Para obtener información sobre estos valores, consulte de enumeración PSMemberTypes en el SDK de PowerShell.

No todos los objetos tienen todos los tipos de miembro. Si especifica un tipo de miembro que el objeto no tiene, PowerShell devuelve un error.

Tipo:PSMemberTypes
Alias:Type
Valores aceptados:AliasProperty, CodeMethod, CodeProperty, NoteProperty, ScriptMethod, ScriptProperty
Posición:0
Valor predeterminado:None
Requerido:True
Aceptar entrada de canalización:False
Aceptar caracteres comodín:False

-Name

Especifica el nombre del miembro que agrega este cmdlet.

Tipo:String
Posición:1
Valor predeterminado:None
Requerido:True
Aceptar entrada de canalización:False
Aceptar caracteres comodín:False

-NotePropertyMembers

Especifica un diccionario hash o ordenado que contiene un par clave-valor que representa nombres de NoteProperty y sus valores. Para obtener más información sobre las tablas hash y los diccionarios ordenados en PowerShell, consulte about_Hash_Tables.

Este parámetro se introdujo en Windows PowerShell 3.0.

Tipo:IDictionary
Posición:0
Valor predeterminado:None
Requerido:True
Aceptar entrada de canalización:False
Aceptar caracteres comodín:False

-NotePropertyName

Especifica el nombre de la propiedad de nota.

Use este parámetro con el parámetro NotePropertyValue. Este parámetro es opcional.

Este parámetro se introdujo en Windows PowerShell 3.0.

Tipo:String
Posición:0
Valor predeterminado:None
Requerido:True
Aceptar entrada de canalización:False
Aceptar caracteres comodín:False

-NotePropertyValue

Especifica el valor de la propiedad note.

Use este parámetro con el parámetro NotePropertyName. Este parámetro es opcional.

Este parámetro se introdujo en Windows PowerShell 3.0.

Tipo:Object
Posición:1
Valor predeterminado:None
Requerido:True
Aceptar entrada de canalización:False
Aceptar caracteres comodín:False

-PassThru

Devuelve un objeto que representa el elemento con el que está trabajando. De forma predeterminada, este cmdlet no genera ninguna salida.

Para la mayoría de los objetos, Add-Member agrega los nuevos miembros al objeto de entrada. Sin embargo, cuando el objeto de entrada es una cadena, Add-Member no puede agregar el miembro al objeto de entrada. Para estos objetos, use el parámetro PassThru para crear un objeto de salida.

En Windows PowerShell 2.0, Add-Member agregar miembros solo al contenedor psObject de objetos, no al objeto . Use el parámetro PassThru para crear un objeto de salida para cualquier objeto que tenga un contenedor de PSObject de .

Tipo:SwitchParameter
Posición:Named
Valor predeterminado:None
Requerido:False
Aceptar entrada de canalización:False
Aceptar caracteres comodín:False

-SecondValue

Especifica información adicional opcional sobre aliasProperty, ScriptProperty o miembros CodeProperty.

Si se usa al agregar un AliasProperty, este parámetro debe ser un tipo de datos. Se agrega una conversión al tipo de datos especificado al valor del AliasProperty. Por ejemplo, si agrega un AliasProperty que proporciona un nombre alternativo para una propiedad de cadena, también puede especificar un parámetro SecondValue de System.Int32 para indicar que el valor de esa propiedad de cadena debe convertirse en un entero cuando se tenga acceso a él mediante el AliasProperty correspondiente.

Para un CodeProperty, el valor debe ser una referencia a un método que implemente un descriptor de acceso set . Use el método GetMethod() de una referencia de tipo para obtener una referencia a un método. El método debe tomar un único parámetro que sea un PSObject. El descriptor de acceso Get se asigna mediante el parámetro Value .

Para un ScriptProperty, el valor debe ser un bloque de script que implemente un descriptor de acceso Set. El descriptor de acceso Get se asigna mediante el parámetro Value .

Tipo:Object
Posición:3
Valor predeterminado:None
Requerido:False
Aceptar entrada de canalización:False
Aceptar caracteres comodín:False

-TypeName

Especifica un nombre para el tipo.

Cuando el tipo es una clase del espacio de nombres de System o un tipo que tiene un acelerador de tipos, puede escribir el nombre corto del tipo. De lo contrario, se requiere el nombre de tipo completo. Este parámetro solo es efectivo cuando el InputObject es un PSObject.

Este parámetro se introdujo en Windows PowerShell 3.0.

Tipo:String
Posición:Named
Valor predeterminado:None
Requerido:False
Aceptar entrada de canalización:False
Aceptar caracteres comodín:False

-Value

Especifica el valor inicial del miembro agregado. Si agrega unAliasProperty , CodePropertyo miembro scriptProperty, puede proporcionar información adicional mediante el parámetro SecondValue.

  • Para un AliasProperty, el valor debe ser el nombre de la propiedad que se está aliasando.
  • Para un CodeMethod, el valor debe ser una referencia a un método . Use el método GetMethod() de una referencia de tipo para obtener una referencia a un método.
  • Para un CodeProperty, el valor debe ser una referencia a un método que implemente un descriptor de acceso Get. Use el método GetMethod() de una referencia de tipo para obtener una referencia a un método. referencia. El método debe tomar un único parámetro que sea un PSObject. El descriptor de acceso set se asigna mediante el parámetro SecondValue.
  • Para un ScriptMethod, el valor debe ser un bloque de script.
  • Para un ScriptProperty, el valor debe ser un bloque de script que implemente un descriptor de acceso Get. El descriptor de acceso set se asigna mediante el parámetro SecondValue.
Tipo:Object
Posición:2
Valor predeterminado:None
Requerido:False
Aceptar entrada de canalización:False
Aceptar caracteres comodín:False

Entradas

PSObject

Puede canalizar cualquier objeto a este cmdlet.

Salidas

None

De forma predeterminada, este cmdlet no devuelve ninguna salida.

Object

Cuando se usa el parámetro PassThru, este cmdlet devuelve el objeto recién extendido.

Notas

Solo puede agregar miembros a objetos de tipo PSObject. Para determinar si un objeto es un objeto PSObject, use el operador -is. Por ejemplo, para probar un objeto almacenado en la variable $obj, escriba $obj -is [psobject].

PSObject objetos de tipo mantienen su lista de miembros en el orden en que los miembros se agregaron al objeto.

Los nombres de MemberType, Name, Valuey parámetros secondValue son opcionales. Si omite los nombres de parámetro, los valores de parámetro sin nombre deben aparecer en este orden: MemberType, Name, Valuey SecondValue.

Si incluye los nombres de parámetro, los parámetros pueden aparecer en cualquier orden.

Puede usar la variable automática $this en bloques de script que definen los valores de las nuevas propiedades y métodos. La variable $this hace referencia a la instancia del objeto al que se agregan las propiedades y los métodos. Para obtener más información sobre la variable de $this, vea about_Automatic_Variables.