Adding Custom Properties

by Aug 26, 2009

You may have heard that PowerShell can add custom properties to objects. While we are not going into much detail about this here, we'd like to explain why this works for some objects and not for others.

Let's assume you pick a process object, in this case any running PowerShell process:

$process = @(get-process powershell)[0]

Now, to add a new property, all you would need to do is use Add-Member:

$process | Add-Member NoteProperty SayHello Hello

Now, $process has a new property called SayHello and returns "Hello":

$process.SayHello

When you try the same with a different object such as a string, it fails:

$object = "Hello"
$object | Add-Member NoteProperty SayHello Hello
$object.SayHello

The truth is PowerShell can add new properties only to its own object types (PSObject). So if the object you want to extend is not of the correct type, Add-Member cannot manipulate it. To solve this issue, use the -passThru parameter and update the variable. This way, Add-Member converts your object into the appropriate type, adds the property and updates your variable:

$object = "Hello"
$object = $object | Add-Member NoteProperty SayHello Hello -passThru
$object.SayHello

Twitter This Tip! ReTweet this Tip!