我认为在Javascript中可以这样做.在Powershell中,我不确定如何:
假设我想用我的自定义方法覆盖对write-host的每次调用,但有时我想在我的overide中执行本机write-host.是否可以将本机实现存储在另一个名称下,以便稍后从新实现中调用它?
更新:在我看来,答案https://serverfault.com/a/642299/236470并没有完全回答我的问题的第二部分.如何存储和调用本机实现?
Mat*_*att 15
对函数的调用将覆盖cmdlet.您可以从TechNet上的about_Command_Precedence了解更多信息...
如果未指定路径,Windows PowerShell在运行命令时将使用以下优先顺序:
- 别号
- 功能
- 小命令
- 本机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
您还可以查看所谓的代理函数,但我认为这对您打算做的事情来说太过分了.
是的你可以.我在ServerFault上有一个答案,但由于它是一个不同的网站,我会复制它,因为我无法关闭到另一个网站的副本.
是的,您可以Get-ChildItem在Powershell中覆盖或任何其他cmdlet.
命名您的功能相同如果您在同一范围内创建具有相同名称的功能,则将使用您的功能.
例:
Run Code Online (Sandbox Code Playgroud)Function Get-ChildItem { [CmdletBinding()] param( # Simulate the parameters here ) # ... do stuff }使用别名创建自己的函数,然后为该函数创建一个别名,其名称与要覆盖的cmdlet相同.
例:
Run Code Online (Sandbox Code Playgroud)Function My-GetChildItem { [CmdletBinding()] param( # Simulate the parameters here ) # ... do stuff } New-Alias -Name 'Get-ChildItem' -Value 'My-GetChildItem' -Scope Global这种方式很好,因为在不踩踏内置函数的情况下测试函数更容易,并且可以控制cmdlet何时被覆盖或不在代码中.
要删除别名:
Run Code Online (Sandbox Code Playgroud)Remove-Item 'Alias:\Get-ChildItem' -Force