Add custom method to custom object


In a previous post, we saw how to create PowerShell Objects.

Today, we’ll see how to add custom methods to custom PowerShell object :

Add-Member -memberType ScriptMethod -InputObject $Computer -Name "Ping" -Value {Test-Connection -ComputerName $this.Name -Quiet -Count 1 } -Force
$Computer | Get-Member

The first line adds the method to our object, the second one execute it, and the third shows us the object, with the function in it :


If we create an ‘ItForDummies.Compter’ object with a dummy computer name :

$DummyComputer = [PsCustomObject][Ordered]@{Name = "DoesNotExists"; State = "Unknown"; OS = "Unknown"; PsTypeName ='ItForDummies.Computer'}
Add-Member -memberType ScriptMethod -InputObject $DummyComputer -Name "Ping" -Value {Test-Connection -ComputerName $this.Name -Quiet -Count 1 } -Force


The ping failed.

As you can see, we need to add the method to all objects we create. The good way to do this is to add the method to the type, and not the object :

$Ping = @{
    MemberName = 'Ping'
    MemberType = 'ScriptMethod'
    Value = {Test-Connection -ComputerName $this.Name -Quiet -Count 1 }
    Force = $true
Update-TypeData -TypeName 'ItForDummies.Computer' @Ping
$NewComputer = [PsCustomObject][Ordered]@{Name = "localhost"; State = "Unknown"; OS = "Unknown"; PsTypeName ='ItForDummies.Computer'}


All new ‘ItForDummies.Computer’ objects with have the “Ping()” method.

That’s pretty nice, but you can go further. You noticed that the ‘ItForDummies.Computer’ has a ‘State’ property ?

Look at  this :

$Ping = @{
    MemberName = 'Ping'
    MemberType = 'ScriptMethod'
    Value = {if(Test-Connection -ComputerName $this.Name -Quiet -Count 1){$this.State = "Online"}else{$this.State = "Offline"}}
    Force = $true
Update-TypeData -TypeName 'ItForDummies.Computer' @Ping
$OnlineComputer = [PsCustomObject][Ordered]@{Name = "localhost"; State = "Unknown"; OS = "Unknown"; PsTypeName ='ItForDummies.Computer'}
$OfflineComputer = [PsCustomObject][Ordered]@{Name = "DoesNotExist"; State = "Unknown"; OS = "Unknown"; PsTypeName ='ItForDummies.Computer'}


The property ‘State’ actualize after calling the ‘Ping()’ method !

Leave a Reply