我可以覆盖Powershell本机cmdlet,但可以从我的覆盖中调用它

时间:2015-11-17 00:41:39

标签: powershell

我认为在Javascript中可以这样做。在Powershell中,我不确定如何:

让我们说我想用我的自定义方法覆盖对write-host的每次调用,但有时候我想在我的overide中执行本机write-host。是否可以将本机实现存储在另一个名称下,以便稍后从新实现中调用它?

更新:在我看来,答案https://serverfault.com/a/642299/236470并未完全回答我问题的第二部分。如何存储和调用本机实现?

2 个答案:

答案 0 :(得分:14)

调用函数将覆盖cmdlet。您可以从about_Command_Precedence on TechNet ...

了解更多信息
  

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

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

因此,只需创建与本机cmdlet同名的函数即可获得所需内容。

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
        }
    }
}

所以现在write-host适用于我们可以过滤的管道输入。呼叫"真实" cmdlet与在调用中指定模块一样简单。您可以在上面的代码示例中看到我已经完成了两次。一些示例用法和输出如下:

enter image description here

请注意,如果将其保存在个人资料或其他类似的内容中,请不要忘记已经完成此操作。如有疑问,请使用Get-Command Write-Host。在我的情况下,您可以通过调用Remove-Item function:write-host

来删除覆盖

您还可以查看所谓的代理函数,但我认为这对您打算做的事情来说太过分了。

答案 1 :(得分:8)

是的,你可以。 I have an answer for that here on 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