Can I override a Powershell native cmdlet but call it from my override

Yes you can. I have an answer for that here on ServerFault, but since it's a different site I'll copy it since I can't close as duplicate to another site.


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

Calls to functions will override cmdlets. You can read more on this from about_Command_Precedence on TechNet ...

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

So simply making a function of the same name as a native cmdlet will get you what you want.

function Write-Host{
    [cmdletbinding()]
    param(
        [Parameter(Mandatory,ValueFromPipeline)]
        $string
    )
    Process {
        # Executes once for each pipeline object
        If ($string -match "bagels"){
            Microsoft.PowerShell.Utility\Write-Host $string -ForegroundColor Green
        }else{
            Microsoft.PowerShell.Utility\Write-Host $string
        }
    }
}

So now write-host works with pipeline input that we can filter with. Calling the "real" cmdlet is as easy as specifying the module in the call. You can see I have done that twice in the above code sample. Some sample usage and output would be the following:

enter image description here

Be careful that you don't forget you have done this if you save it in a profile or something of that nature. Use Get-Command Write-Host whenever in doubt. In my case you can remove the override by calling Remove-Item function:write-host

You can also look into what are called proxy functions but I think that is overkill for what you intend to do.

Tags:

Powershell