How Do You Override a Function in Powershell How Do You Override a Function in Powershell powershell powershell

How Do You Override a Function in Powershell


If you're referring to a method, Chris Dent's answer covers that nicely!

For native PowerShell cmdlets/functions I will copy my answer from ServerFault here:

Yes, you can override Get-ChildItem or any other cmdlet in Powershell.

Name Your Function The Same

If you make a function with the same name in the same scope, yours will be used.

Example:

Function Get-ChildItem {[CmdletBinding()]param(    # Simulate the parameters here)    # ... do stuff}

Using Aliases

Create your own function, and then create an alias to that function, with the same name as the cmdlet you want to override.

Example:

Function My-GetChildItem {[CmdletBinding()]param(    # Simulate the parameters here)    # ... do stuff}New-Alias -Name 'Get-ChildItem' -Value 'My-GetChildItem' -Scope Global

This way is nice because it's easier to test your function without stomping on the built-in function, and you can control when the cmdlet is overridden or not within your code.

To remove the alias:

Remove-Item 'Alias:\Get-ChildItem' -Force

Know the Command Precedence

about_Command_Precedence lists the order in which commands of different types are interpreted:

If you do not specify a path, Windows PowerShell uses the following precedence order when it runs commands:

  1. Alias
  2. Function
  3. Cmdlet
  4. Native Windows commands


You need to override the method on a class not a function.

You may be able to override it with a script block (I've not done much with the undisclosed Forms-based class so this is a guess).

The Force parameter will let Add-Member replace a method, depending a bit on the protection / access modifiers in the class. This approach would work well for overriding ToString for instance.

$baseObject | Add-Member Point -MemberType ScriptMethod -Value { return $this.AutoScrollPosition } -Force