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

我可以覆盖Powershell本机cmdlet,但可以从覆盖中调用它吗,powershell,Powershell,在Javascript中,我认为这样做是可能的。在Powershell中,我不知道如何: 假设我想用我的自定义方法覆盖对写主机的每个调用,但有时我想在overide中执行本机写主机。是否可以用另一个名称存储本机实现,以便以后从新实现调用它 更新:在我看来,答案并没有完全回答我问题的第二部分。如何存储和调用本机实现?对函数的调用将覆盖cmdlet。你可以阅读更多关于这一点从 如果未指定路径,Windows PowerShell将使用以下命令 运行命令时的优先顺序: 别名 作用 Cmdlet 本机W

在Javascript中,我认为这样做是可能的。在Powershell中,我不知道如何:

假设我想用我的自定义方法覆盖对写主机的每个调用,但有时我想在overide中执行本机写主机。是否可以用另一个名称存储本机实现,以便以后从新实现调用它


更新:在我看来,答案并没有完全回答我问题的第二部分。如何存储和调用本机实现?

对函数的调用将覆盖cmdlet。你可以阅读更多关于这一点从

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

  • 别名
  • 作用
  • Cmdlet
  • 本机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
            }
        }
    }
    
    因此,现在
    write host
    可以使用管道输入进行过滤。调用“real”cmdlet与在调用中指定模块一样简单。在上面的代码示例中,您可以看到我已经做了两次。一些示例用法和输出如下所示:

    如果您将其保存在配置文件或类似的内容中,请小心不要忘记您已经完成了此操作。如有疑问,请使用
    Get命令Write Host
    。在我的例子中,您可以通过调用
    remove Item函数:write host

    您还可以研究所谓的代理函数,但我认为这对于您打算做的事情来说是过分的

    是的,你可以,但是,因为它是一个不同的网站,我会复制它,因为我不能复制到另一个网站


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

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

    例如:

    函数Get ChildItem{ [CmdletBinding()] param( #在这里模拟参数 ) #…做事 } 使用别名 创建自己的函数,然后为该函数创建别名,该别名与要覆盖的cmdlet同名

    例如:

    函数My GetChildItem{
    [CmdletBinding()]
    param(
    #在这里模拟参数
    )
    #…做事
    }
    新别名-名称“Get ChildItem”-值“My GetChildItem”-作用域全局
    
    这种方法很好,因为它更容易在没有 踩下内置函数,您可以控制cmdlet 被重写或不在代码中

    要删除别名,请执行以下操作:

    Remove Item'别名:\Get ChildItem'-Force
    

    我对SF答案的一个建议是链接到about_Command_priority,因为它解释了为什么我帮了你一次Jackpot:)@briantist在我看来,答案并没有完全回答我问题的第二部分。如何存储和调用本机实现?@user310291我认为您实际上是正确的;您应该接受Matt的回答,因为他充分解释了如何调用本机版本。@user310291,除非我误解了我已经回答过的问题。您可以通过在本机实现前面加上模块名来调用本机实现。这就是我在示例函数中所做的。你不需要储存它。它总是在那里。注意:
    $\uuu
    仅在管道化时工作,因此如果您像
    编写主机“任何东西”一样调用它,则该函数在all@DineiRockenbach是的,那是真的。回答的范围不应该包括如何实现这一点的所有细微差别。谢谢!做了一个小的修正,希望我没有把事情搞砸(我假设
    写主机“百吉饼”
    写主机“百吉饼”|写主机
    的行为不同是无意的)。