我可以覆盖Powershell本机cmdlet,但可以从覆盖中调用它吗
在Javascript中,我认为这样做是可能的。在Powershell中,我不知道如何: 假设我想用我的自定义方法覆盖对写主机的每个调用,但有时我想在overide中执行本机写主机。是否可以用另一个名称存储本机实现,以便以后从新实现调用它我可以覆盖Powershell本机cmdlet,但可以从覆盖中调用它吗,powershell,Powershell,在Javascript中,我认为这样做是可能的。在Powershell中,我不知道如何: 假设我想用我的自定义方法覆盖对写主机的每个调用,但有时我想在overide中执行本机写主机。是否可以用另一个名称存储本机实现,以便以后从新实现调用它 更新:在我看来,答案并没有完全回答我问题的第二部分。如何存储和调用本机实现?对函数的调用将覆盖cmdlet。你可以阅读更多关于这一点从 如果未指定路径,Windows PowerShell将使用以下命令 运行命令时的优先顺序: 别名 作用 Cmdlet 本机W
更新:在我看来,答案并没有完全回答我问题的第二部分。如何存储和调用本机实现?对函数的调用将覆盖cmdlet。你可以阅读更多关于这一点从 如果未指定路径,Windows PowerShell将使用以下命令 运行命令时的优先顺序:
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是的,那是真的。回答的范围不应该包括如何实现这一点的所有细微差别。谢谢!做了一个小的修正,希望我没有把事情搞砸(我假设写主机“百吉饼”
和写主机“百吉饼”|写主机
的行为不同是无意的)。