我认为在Javascript中可以这样做。在Powershell中,我不确定如何:
让我们说我想用我的自定义方法覆盖对write-host的每次调用,但有时候我想在我的overide中执行本机write-host。是否可以将本机实现存储在另一个名称下,以便稍后从新实现中调用它?
更新:在我看来,答案https://serverfault.com/a/642299/236470并未完全回答我问题的第二部分。如何存储和调用本机实现?
答案 0 :(得分:14)
调用函数将覆盖cmdlet。您可以从about_Command_Precedence on TechNet ...
了解更多信息如果未指定路径,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
适用于我们可以过滤的管道输入。呼叫"真实" cmdlet与在调用中指定模块一样简单。您可以在上面的代码示例中看到我已经完成了两次。一些示例用法和输出如下:
请注意,如果将其保存在个人资料或其他类似的内容中,请不要忘记已经完成此操作。如有疑问,请使用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