如何覆盖Powershell中的函数

时间:2016-08-03 20:08:53

标签: winforms powershell override

我可以在网上找到关于这样做的所有内容是覆盖cmdlet,但我需要覆盖一个Windows窗体事件。这是我需要的C#等价物:

protected override Point ScrollToControl(Control activeControl)
{
    return this.AutoScrollPosition;
}

他们说你只是在相同的范围内使用该功能的名称,它会自动覆盖它,但这对我不起作用。

2 个答案:

答案 0 :(得分:6)

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

对于本机PowerShell cmdlet /函数,我将在此处复制my answer from ServerFault

是的,您可以在Powershell中覆盖Get-ChildItem或任何其他cmdlet。

将您的功能命名为相同

如果在同一范围内创建具有相同名称的函数,则将使用您的函数。

实施例:

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

使用别名

创建自己的函数,然后为该函数创建一个别名,其名称与要覆盖的cmdlet同名。

示例:

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

New-Alias -Name 'Get-ChildItem' -Value 'My-GetChildItem' -Scope Global

这种方式很好,因为在不踩踏内置函数的情况下测试函数更容易,并且可以控制cmdlet何时被覆盖或不在代码中。

删除别名:

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

了解命令优先顺序

about_Command_Precedence列出了解释不同类型命令的顺序:

  

如果未指定路径,Windows PowerShell将使用以下命令            运行命令时的优先顺序:

     
      
  1. 别名
  2.   
  3. 功能
  4.   
  5. Cmdlet
  6.   
  7. 原生Windows命令
  8.   

答案 1 :(得分:2)

您需要覆盖类而不是函数的方法。

您可以使用脚本块覆盖它(我对未公开的基于表单的类做了很多,所以这是猜测)。

Force参数将让Add-Member替换一个方法,具体取决于类中的保护/访问修饰符。例如,这种方法适用于覆盖ToString。

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