Bird
Raised Fist0
PowerShellscripting~10 mins

Adding methods with ScriptMethod in PowerShell - Step-by-Step Execution

Choose your learning style10 modes available
Concept Flow - Adding methods with ScriptMethod
Create object
↓
Define script block
↓
Add ScriptMethod to object
↓
Call method
↓
Method executes script block
↓
Output result
This flow shows how to create an object, add a ScriptMethod to it, then call that method to run the script block and get the output.
Execution Sample
PowerShell
$obj = New-Object PSObject
$scriptBlock = { "Hello, World!" }
$obj | Add-Member -MemberType ScriptMethod -Name Greet -Value $scriptBlock
$obj.Greet()
Creates an object, adds a ScriptMethod named Greet that returns 'Hello, World!', then calls the method.
Execution Table
StepActionVariable StateOutput
1Create new PSObject assigned to $obj$obj = PSObject (empty)
2Define script block returning 'Hello, World!'$scriptBlock = script block
3Add ScriptMethod 'Greet' to $obj with $scriptBlock$obj has method Greet
4Call $obj.Greet()$obj unchangedHello, World!
5End of script$obj unchanged
💡 Script ends after calling the ScriptMethod and outputting the result.
Variable Tracker
VariableStartAfter Step 1After Step 2After Step 3After Step 4Final
$objundefinedPSObject (empty)PSObject (empty)PSObject with ScriptMethod GreetPSObject with ScriptMethod GreetPSObject with ScriptMethod Greet
$scriptBlockundefinedundefinedScript block returning 'Hello, World!'Script block returning 'Hello, World!'Script block returning 'Hello, World!'Script block returning 'Hello, World!'
Key Moments - 3 Insights
Why do we use a script block when adding a ScriptMethod?
The script block holds the code that runs when the method is called. See execution_table step 2 and 3 where the script block is defined and then added as a method.
Does adding a ScriptMethod change the object’s existing properties?
No, it only adds a new method. The object’s other properties stay the same. See variable_tracker for $obj before and after adding the method.
What happens when we call the ScriptMethod?
The script block runs and returns its output. See execution_table step 4 where calling $obj.Greet() outputs 'Hello, World!'.
Visual Quiz - 3 Questions
Test your understanding
Look at the execution_table at step 3. What does $obj have after adding the ScriptMethod?
AA new property named Greet
BA new method named Greet
CThe script block removed
DNo changes
💡 Hint
Check the 'Variable State' column at step 3 in the execution_table.
At which step does the script block get defined?
AStep 1
BStep 3
CStep 2
DStep 4
💡 Hint
Look at the 'Action' column describing defining the script block.
If we change the script block to return 'Hi!', what will be the output at step 4?
AHi!
BNo output
CHello, World!
DError
💡 Hint
The output depends on what the script block returns when the method is called.
Concept Snapshot
Add methods to objects using ScriptMethod.
Define a script block with the method code.
Use Add-Member -MemberType ScriptMethod to add it.
Call the method like a normal function.
The script block runs and returns output.
Full Transcript
This example shows how to add a method to a PowerShell object using ScriptMethod. First, we create a new PSObject and store it in $obj. Then, we define a script block that returns the string 'Hello, World!'. Next, we add this script block as a ScriptMethod named Greet to the $obj using Add-Member. Finally, we call $obj.Greet(), which runs the script block and outputs 'Hello, World!'. The object itself does not change except for having the new method added. This method behaves like a function attached to the object.

Practice

(1/5)
1. What does the Add-Member -MemberType ScriptMethod cmdlet do in PowerShell?
easy
A. Deletes a property from an object
B. Adds a custom method (function) to an existing object
C. Creates a new object from scratch
D. Converts an object to a string

Solution

  1. Step 1: Understand Add-Member usage

    Add-Member is used to add properties or methods to existing objects in PowerShell.
  2. Step 2: Focus on ScriptMethod type

    When -MemberType ScriptMethod is used, it adds a method (a function) that can be called on the object.
  3. Final Answer:

    Adds a custom method (function) to an existing object -> Option B
  4. Quick Check:

    Add-Member ScriptMethod = Adds method [OK]
Hint: ScriptMethod adds functions to objects, not properties [OK]
Common Mistakes:
  • Confusing ScriptMethod with adding properties
  • Thinking it creates new objects
  • Assuming it deletes object members
2. Which of the following is the correct syntax to add a ScriptMethod named Greet to an object $obj that returns 'Hello'?
easy
A. $obj | Add-Member -MemberType ScriptMethod -Name Greet -Value { 'Hello' }
B. Add-Member -InputObject $obj -MemberType ScriptProperty -Name Greet -Value { 'Hello' }
C. $obj.AddMember('Greet', { 'Hello' })
D. Add-Member -InputObject $obj -MemberType ScriptMethod -Name Greet -Value 'Hello'

Solution

  1. 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.
  2. 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.
  3. Final Answer:

    $obj | Add-Member -MemberType ScriptMethod -Name Greet -Value { 'Hello' } -> Option A
  4. Quick Check:

    ScriptMethod needs script block value [OK]
Hint: Use a script block { } for ScriptMethod -Value [OK]
Common Mistakes:
  • Using ScriptProperty instead of ScriptMethod
  • Passing string instead of script block
  • Wrong cmdlet syntax without piping or -InputObject
3. What will be the output of this PowerShell code?
$obj = New-Object PSObject -Property @{Name='Alice'}
$obj | Add-Member -MemberType ScriptMethod -Name SayName -Value { "My name is $($this.Name)" }
$obj.SayName()
medium
A. My name is
B. My name is $this.Name
C. My name is Alice
D. Error: Property 'Name' not found

Solution

  1. Step 1: Understand object and method

    $obj has a property Name='Alice'. The ScriptMethod SayName uses $this.Name to access that property.
  2. 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'.
  3. Final Answer:

    My name is Alice -> Option C
  4. Quick Check:

    $this.Name accesses property correctly [OK]
Hint: Use $this to access object properties inside ScriptMethod [OK]
Common Mistakes:
  • Expecting literal $this.Name output
  • Confusing property access syntax
  • Thinking method won't access object properties
4. Identify the error in this code snippet that tries to add a ScriptMethod to $obj:
$obj = New-Object PSObject -Property @{Age=30}
Add-Member -InputObject $obj -MemberType ScriptMethod -Name GetAge -Value { return $Age }
$obj.GetAge()
medium
A. The property Age does not exist on $obj
B. Add-Member requires piping the object, not -InputObject
C. ScriptMethod cannot return values
D. The script block should use $this.Age to access the property

Solution

  1. Step 1: Check property access inside ScriptMethod

    The script block uses $Age which is undefined in this scope. To access the object's property, use $this.Age.
  2. Step 2: Verify other parts

    Using -InputObject is valid. ScriptMethod can return values. Property Age exists on $obj.
  3. Final Answer:

    The script block should use $this.Age to access the property -> Option D
  4. Quick Check:

    Use $this.Property inside ScriptMethod [OK]
Hint: Inside ScriptMethod, always use $this.Property to access object data [OK]
Common Mistakes:
  • Using property name without $this inside script block
  • Thinking piping is mandatory for Add-Member
  • Assuming ScriptMethod can't return values
5. You want to add a ScriptMethod 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?
hard
A. $person | Add-Member -MemberType ScriptMethod -Name FullName -Value { "$($this.FirstName) $($this.LastName)" }
B. $person | Add-Member -MemberType ScriptProperty -Name FullName -Value { "$($this.FirstName) $($this.LastName)" }
C. $person | Add-Member -MemberType ScriptMethod -Name FullName -Value { $this.FirstName + $this.LastName }
D. $person | Add-Member -MemberType ScriptMethod -Name FullName -Value { return "$this.FirstName $this.LastName" }

Solution

  1. Step 1: Confirm correct MemberType and method body

    The method must be a ScriptMethod, not ScriptProperty.
  2. 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.
  3. 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.
  4. Final Answer:

    $person | Add-Member -MemberType ScriptMethod -Name FullName -Value { "$($this.FirstName) $($this.LastName)" } -> Option A
  5. Quick Check:

    Use string interpolation with $() for properties [OK]
Hint: Use "$($this.Prop) $($this.Prop)" for spaced string in ScriptMethod [OK]
Common Mistakes:
  • Using ScriptProperty instead of ScriptMethod
  • Concatenating strings without space
  • Not using $() for property expansion inside strings
Recommended

Ready to prove it?

Pass the test and this pattern moves unknown strong while earning +1 Grip toward your certificate.

10 questions~5 mineasy hard