Udostępnij za pośrednictwem


Method overriding in PowerShell

During a workshop of PowerShell a student made the following great question: "You told me that PowerShell is object-oriented, but I didn't see anything about methods overrinding. is that possible in PowerShell? "

That was an excellent question, for more details about objects in the PoweShell see PowerShell | Objects.

The answer is that there is a way to do that. Let's say I want to create a function that overwrite the Get-Process cmdlet. The standard return of this command would be something like the following:

To override this cmdlet, you simply create the following function:

function Get-Process ()

{

Write-Host "this is an example of function overloading in powershell"-ForegroundColor Green

Microsoft.powershell. Management\Get-Process | FT id, name,
@ {n = "Virtual Memory (MB)"; e = {[Math]:: Round ($ _. VM/1 MB, 2)}},
@ {n = "Private Bytes (MB)"; e = {[Math]:: Round ($ _. PrivateMemorySize/1 MB, 2)}},
@ {n = "Working Set (MB)"; e = {[Math]:: Round ($ _. Workingset/1 MB, 2)}}

}

Note that the function has the same name as the Get-Process cmdlet with the difference that to run the Get-Process the original namespace of the same was used to avoid recursion.

The function returns a message and formats the return of the Get-Process cmdlet where only 4 properties are returned with the value in Megabytes. The result of the execution of the overloaded function in this case is:

 

I hope you enjoyed. Until the next.

Comments

  • Anonymous
    January 21, 2016
    Interesting trick, but not sure about the recursion statement.

  • Anonymous
    January 21, 2016
    Hi Sean, To be able to call the original Get-Process, in this case, you need to use the entire namespace: Microsoft.powershell. ManagementGet-Process. If you don't use that, you will receive a stack overflow due a infinite recursive.

  • Anonymous
    January 21, 2016
    Very nice tip. But it looks that the technic used here was shadowing, when a narrow scoped member hides a wide scoped member of the same name. Is the equivalent of using the new operator in C# or Shadows operator in VB. This method in fact works as a proxy to the original Get-Process.

  • Anonymous
    January 21, 2016
    Perfect. You are right. That is a way to simulate method overriding in PowerShell. ;)