Add-Member

Adds a user-defined custom member to an instance of a Windows PowerShell object.

Syntax

Add-Member [-MemberType] {<AliasProperty> | <CodeProperty> | <Property> | <NoteProperty> | <ScriptProperty> | <Properties> | <PropertySet> | <Method> | <CodeMethod> | <ScriptMethod> | <Methods> | <ParameterizedProperty> | <MemberSet> | <Event> | <All>} [-Name] <string> -InputObject <psobject> [[-Value] <Object>] [[-SecondValue] <Object>] [-Force] [-PassThru] [<CommonParameters>]

Description

The Add-Member cmdlet adds a user-defined custom member to an instance of a Windows PowerShell object. It lets you add the following types of members: AliasProperty, CodeProperty, NoteProperty, ScriptProperty, PropertySet, CodeMethod, MemberSet, and ScriptMethod. You set the initial value of the member by using the Value parameter. In the case of AliasProperty, ScriptProperty, CodeProperty, and CodeMethod, you can supply additional information by using the SecondValue parameter.

The additional members are added to the particular instance of the object that you pipe to Add-Member or specify using the InputObject parameter. The additional member is available only while that instance exists. You can use the Export-Clixml cmdlet to save the instance, including the additional members, to a file. The information stored in that file can be used by the Import-Clixml cmdlet to re-create the instance of the object.

Parameters

-Force

Adds a new member even if one with the same name already exists. Does not work for core members of a type.

Required?

false

Position?

named

Default Value

none

Accept Pipeline Input?

false

Accept Wildcard Characters?

false

-InputObject <psobject>

Specifies the object to which the new member is added. Enter a variable that contains the objects, or type a command or expression that gets the objects.

Required?

true

Position?

named

Default Value

none

Accept Pipeline Input?

true (ByValue)

Accept Wildcard Characters?

false

-MemberType <PSMemberTypes>

Specifies the type of the member to add. This parameter is mandatory.

The valid values for this parameter are:

-- AliasProperty: A property that defines a new name for an existing property.

-- CodeMethod: A method that references a static method of a Microsoft .NET Framework class.

-- CodeProperty: A property that references a static property of a .NET Framework class.

-- MemberSet: A predefined collection of properties and methods, such as PSBase, PSObject, and PSTypeNames.

-- Method: A method of the underlying .NET Framework object.

-- NoteProperty: A property with a static value.

-- ParameterizedProperty: A property that takes parameters and parameter values.

-- Property: A property of the underlying .NET Framework object.

-- PropertySet: A predefined collection of object properties.

-- ScriptMethod: A method whose value is the output of a script.

-- ScriptProperty: A property whose value is the output of a script.

-- All: Gets all member types.

-- Methods: Gets all types of methods of the object (e.g. method, codemethod, scriptmethod)

-- Properties: Gets all types of properties of the object (e.g. property, codeproperty, aliasproperty, scriptproperty).

Not all objects have every type of member. If you specify a member type that the object does not have, Windows PowerShell returns an error.

The Event member type is not valid for Add-Member.

Required?

true

Position?

1

Default Value

none

Accept Pipeline Input?

false

Accept Wildcard Characters?

true

-Name <string>

Specifies the name of the member to be added.

If you omit the "Name" parameter name, the value of the -Name parameter must be the second unnamed parameter value in the command. If you include the parameter name, the parameters can appear in any order.

Required?

true

Position?

2

Default Value

none

Accept Pipeline Input?

false

Accept Wildcard Characters?

false

-PassThru

Passes the newly extended object to the pipeline. By default, this cmdlet does not generate any output.

Required?

false

Position?

named

Default Value

none

Accept Pipeline Input?

false

Accept Wildcard Characters?

false

-SecondValue <Object>

Specifies optional additional information about AliasProperty, ScriptProperty, CodeProperty, or CodeMethod members. If used when adding an AliasProperty, this parameter must be a data type. A conversion (cast) to the specified data type is added to the value of the AliasProperty. For example, if you add an AliasProperty that provides an alternate name for a string property, you can also specify a SecondValue parameter of System.Int32 to indicate that the value of that string property should be converted to an integer when accessed by using the corresponding AliasProperty.

You can use the SecondValue parameter to specify an additional ScriptBlock when adding a ScriptProperty member. In that case, the first ScriptBlock, specified in the Value parameter, is used to get the value of a variable. The second ScriptBlock, specified in the SecondValue parameter, is used to set the value of a variable.

Required?

false

Position?

4

Default Value

none

Accept Pipeline Input?

false

Accept Wildcard Characters?

false

-Value <Object>

Specifies the initial value of the added member. If you add an AliasProperty, CodeProperty, or CodeMethod member, you can supply optional, additional information by using the SecondValue parameter.

Required?

false

Position?

3

Default Value

none

Accept Pipeline Input?

false

Accept Wildcard Characters?

false

<CommonParameters>

This cmdlet supports the common parameters: -Verbose, -Debug, -ErrorAction, -ErrorVariable, -OutBuffer, and -OutVariable. For more information, see about_CommonParameters.

Inputs and Outputs

The input type is the type of the objects that you can pipe to the cmdlet. The return type is the type of the objects that the cmdlet returns.

Inputs

System.Management.Automation.PSObject

You can pipe any object type to Add-Member.

Outputs

None or System.Object

When you use the PassThru parameter, Add-Member returns the newly-extended object. Otherwise, this cmdlet does not generate any output.

Notes

You can add members only to PSObject objects. To determine if an object is a PSObject object, use the "is" operator. For example, to test an object stored in the $obj variable, type "$obj -is [PSObject]".

The names of the MemberType, Name, Value, and SecondValue parameters are optional. If you omit the parameter names, the unnamed parameter values must appear in this order: MemberType, Name, Value, SecondValue. If you include the parameter names, the parameters can appear in any order

Example 1

C:\PS>$a = (get-childitem)[0]

C:\PS> $a | add-member -membertype noteproperty -name Status -value done

C:\PS> $a | get-member -type noteproperty

TypeName: System.IO.DirectoryInfo

Name		MemberType   Definition
----		----------   ----------
PSChildName   NoteProperty System.String PSChildName=Co
PSDrive	 NoteProperty System.Management.Automation
PSIsContainer NoteProperty System.Boolean PSIsContainer
PSParentPath  NoteProperty System.String PSParentPath=M
PSPath		NoteProperty System.String PSPath=Microso
PSProvider	NoteProperty System.Management.Automation
Status		NoteProperty System.String Status=done


Description
-----------
These commands add the Status note property to a DirectoryInfo object returned by Get-ChildItem and assigns it a value of "done". 

The first command gets the first object that Get-Childitem returns (index 0).

The second command adds the note property.

The third command uses a pipeline operator (|) to send the updated object to the Get-Member cmdlet. The output shows that the property has been added.






Example 2

C:\PS>$a = (get-childitem)[0]

C:\PS> $a | add-member -membertype aliasproperty -name FileLength -value Length 

C:\PS> $a.filelength

These commands add the FileLength alias property to a DirectoryInfo object returned by Get-ChildItem. The new property is an alias for the Length property. 

The first command gets the first object that Get-Childitem returns (index 0).

The second command adds the alias property.

The third command returns the value of the new FileLength property.






Example 3

C:\PS>$a = "a string"

C:\PS> $a = $a | add-member -membertype noteproperty -name StringUse -value Display -passthru

C:\PS> $a.StringUse

These commands add the StringUse a property to a string. Because the string is not a PSObject object, you must include the PassThru parameter in the command to save the extended string in the variable. The last command in the example displays the new property.






Example 4

C:\PS>$a = "this is a string"

C:\PS> $a = add-member -inputobject $a -membertype scriptmethod -name words `
-value {$this.split()} -passthru

C:\PS> $a.words()

These commands add a script method to a string object. The script method exposes the Split() method of the System.String .NET Framework Class Library class to make it convenient to return the individual words in a string by calling a method named "Words" on the string object. Note that the PassThru parameter is specified to force Add-Member to return the extended string object as output to be stored in the $a variable.






Example 5

C:\PS>$event = get-eventlog -logname system -newest 1

C:\PS> $event.TimeWritten | get-member

C:\PS> add-member -inputobject $event -membertype aliasproperty -name When `
-value TimeWritten -secondvalue System.String

C:\PS> $event.When | get-member

These commands add an AliasProperty to an EventLogEntry object returned by the Get-EventLog cmdlets. The AliasProperty is named "When" and is an alias for the TimeWritten property of the object. The SecondValue parameter is used to specify that the property value should be converted to type System.String when accessed by using the AliasProperty; the TimeWritten property is a DateTime object.

The first command uses the Get-EventLog cmdlet to retrieve the most recent event from the System event log and stores it in the $event variable. 

The second command accesses the TimeWritten property of that event and pipes it to the Get-Member cmdlet to demonstrate that the property is a DateTime type. Add-Member is then used to add an AliasProperty member to the instance of the EventLogEntry object stored in the $event variable. The Name parameter is used to set the name of the new member to "When" and the Value parameter is used to specify that it is an alias for the TimeWritten property. The SecondValue parameter is used to indicate that, when this new member is used, the value it returns should be cast from its original System.DateTime type to a System.String type. 

The third command accesses the new member and pipes it to the Get-Member cmdlet to confirm that it is of type System.String.






Example 6

C:\PS>function Copy-Property ($From, $To)

{
  foreach ($p in Get-Member -InputObject $From -MemberType Property)
  {
	 Add-Member -InputObject $To -MemberType NoteProperty -Name $p.Name 
	 -Value $From.$($p.Name) -Force

	 $To.$($p.Name) = $From.$($p.Name)
   }
}

This function copies all of the properties of one object to another object.

The first command in the function declares the function name and lists its parameters. 

The Foreach loop uses the Get-Member cmdlet to get each of the properties of the From object. The commands within the Foreach loop are performed in series on each of the properties.

The Add-Member command adds the property of the From object to the To object as a NoteProperty. It uses the Force parameter to let the command add members with the same member name.

The last command in the function gives the new property the same name as the original property.






See Also