What if your objects could do their own work without you juggling separate functions?
Why Adding methods with ScriptMethod in PowerShell? - Purpose & Use Cases
Imagine you have a list of objects in PowerShell, and you want each object to perform a specific action, like calculating a value or formatting its data. Without adding methods, you must write separate functions and remember to pass the object each time.
This manual way is slow and confusing. You have to keep track of which function goes with which object. It's easy to make mistakes or forget to update all related functions when your object changes.
Adding methods with ScriptMethod lets you attach actions directly to your objects. Now, each object knows how to do its own tasks, just like a person knows how to tie their own shoes. This makes your scripts cleaner and easier to understand.
$obj = New-Object PSObject -Property @{Name='Box'; Size=10}
function Get-Size { param($o) $o.Size }
Get-Size $obj$obj = New-Object PSObject -Property @{Name='Box'; Size=10}
$obj | Add-Member -MemberType ScriptMethod -Name GetSize -Value { $this.Size }
$obj.GetSize()You can create smart objects that carry their own behaviors, making your scripts more powerful and easier to maintain.
Think about managing a list of files where each file object can tell you its size or last modified date by calling its own method, instead of writing separate commands for each file.
Manual functions separate from objects cause confusion and errors.
ScriptMethod lets objects have their own actions directly attached.
This leads to cleaner, more understandable, and maintainable scripts.
Practice
Add-Member -MemberType ScriptMethod cmdlet do in PowerShell?Solution
Step 1: Understand Add-Member usage
Add-Memberis used to add properties or methods to existing objects in PowerShell.Step 2: Focus on ScriptMethod type
When-MemberType ScriptMethodis used, it adds a method (a function) that can be called on the object.Final Answer:
Adds a custom method (function) to an existing object -> Option BQuick Check:
Add-Member ScriptMethod = Adds method [OK]
- Confusing ScriptMethod with adding properties
- Thinking it creates new objects
- Assuming it deletes object members
Greet to an object $obj that returns 'Hello'?Solution
Step 1: Identify correct Add-Member syntax
The cmdlet requires piping the object or using -InputObject, specifying -MemberType ScriptMethod, -Name, and a script block for -Value.Step 2: Check each option
$obj | Add-Member -MemberType ScriptMethod -Name Greet -Value { 'Hello' } correctly pipes $obj and uses a script block { 'Hello' } as the method body. Add-Member -InputObject $obj -MemberType ScriptProperty -Name Greet -Value { 'Hello' } uses ScriptProperty, which is wrong. $obj.AddMember('Greet', { 'Hello' }) is invalid syntax. Add-Member -InputObject $obj -MemberType ScriptMethod -Name Greet -Value 'Hello' passes a string instead of a script block.Final Answer:
$obj | Add-Member -MemberType ScriptMethod -Name Greet -Value { 'Hello' } -> Option AQuick Check:
ScriptMethod needs script block value [OK]
- Using ScriptProperty instead of ScriptMethod
- Passing string instead of script block
- Wrong cmdlet syntax without piping or -InputObject
$obj = New-Object PSObject -Property @{Name='Alice'}
$obj | Add-Member -MemberType ScriptMethod -Name SayName -Value { "My name is $($this.Name)" }
$obj.SayName()Solution
Step 1: Understand object and method
$obj has a property Name='Alice'. The ScriptMethod SayName uses $this.Name to access that property.Step 2: Evaluate method call output
Calling $obj.SayName() runs the script block, replacing $($this.Name) with 'Alice', so output is 'My name is Alice'.Final Answer:
My name is Alice -> Option CQuick Check:
$this.Name accesses property correctly [OK]
- Expecting literal $this.Name output
- Confusing property access syntax
- Thinking method won't access object properties
$obj:
$obj = New-Object PSObject -Property @{Age=30}
Add-Member -InputObject $obj -MemberType ScriptMethod -Name GetAge -Value { return $Age }
$obj.GetAge()Solution
Step 1: Check property access inside ScriptMethod
The script block uses$Agewhich is undefined in this scope. To access the object's property, use$this.Age.Step 2: Verify other parts
Using -InputObject is valid. ScriptMethod can return values. Property Age exists on $obj.Final Answer:
The script block should use $this.Age to access the property -> Option DQuick Check:
Use $this.Property inside ScriptMethod [OK]
- Using property name without $this inside script block
- Thinking piping is mandatory for Add-Member
- Assuming ScriptMethod can't return values
FullName to an object $person that has properties FirstName and LastName. The method should return the full name with a space between first and last names. Which code correctly implements this?Solution
Step 1: Confirm correct MemberType and method body
The method must be a ScriptMethod, not ScriptProperty.Step 2: Check string concatenation and property access
$person | Add-Member -MemberType ScriptMethod -Name FullName -Value { "$($this.FirstName) $($this.LastName)" } uses string interpolation with $($this.FirstName) and $($this.LastName) separated by space, which correctly returns full name.Step 3: Analyze other options
$person | Add-Member -MemberType ScriptMethod -Name FullName -Value { $this.FirstName + $this.LastName } concatenates without space. $person | Add-Member -MemberType ScriptMethod -Name FullName -Value { return "$this.FirstName $this.LastName" } uses return but misses $() around variables, so variables won't expand properly.Final Answer:
$person | Add-Member -MemberType ScriptMethod -Name FullName -Value { "$($this.FirstName) $($this.LastName)" } -> Option AQuick Check:
Use string interpolation with $() for properties [OK]
- Using ScriptProperty instead of ScriptMethod
- Concatenating strings without space
- Not using $() for property expansion inside strings
Ready to prove it?
Pass the test and this pattern moves unknown
