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

use*_*291 13 powershell

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

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

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

Mat*_*att 15

对函数的调用将覆盖cmdlet.您可以从TechNet上的about_Command_Precedence了解更多信息...

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

  1. 别号
  2. 功能
  3. 小命令
  4. 本机Windows命令

因此,只需创建与本机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
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

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

在此输入图像描述

请注意,如果将其保存在配置文件或其他类似的内容中,请不要忘记已执行此操作.Get-Command Write-Host有疑问时使用.在我的情况下,你可以通过调用删除覆盖Remove-Item function:write-host

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

  • <3 Matt and briantist :-p (3认同)
  • @ user310291除非我误解了这个问题,否则我已经回答了这个问题.您可以通过将其模块名称作为前缀来调用本机实现.这是我在我的示例函数中所做的.你不需要_store_它.它总是在那里. (2认同)

bri*_*ist 8

是的你可以.我在ServerFault上有一个答案,但由于它是一个不同的网站,我会复制它,因为我无法关闭到另一个网站的副本.

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

命名您的功能相同如果您在同一范围内创建具有相同名称的功能,则将使用您的功能.

例:

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

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

例:

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

New-Alias -Name 'Get-ChildItem' -Value 'My-GetChildItem' -Scope Global
Run Code Online (Sandbox Code Playgroud)

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

要删除别名:

Remove-Item 'Alias:\Get-ChildItem' -Force
Run Code Online (Sandbox Code Playgroud)