【问题标题】:PowerShell - How do I call a cmdlet in a function when overriding that cmdlet's name with the same name as the function?PowerShell - 使用与函数同名的 cmdlet 名称覆盖函数时,如何在函数中调用 cmdlet?
【发布时间】:2011-07-30 05:22:08
【问题描述】:

所以我有一个名为 update-name 的 cmdlet,我无权更改。

我创建了一个名为 update-name 的函数(与 cmdlet 同名)。如何从具有相同名称的函数中调用 cmdlet?

我已经尝试了一些方法,但似乎都不起作用。

function update-name {
param([string] something)
  #call cmdlet update-name here
}

当它只是函数时,有一种方法可以做到:

$unBackup = 'DefaultUpdateName'
if(!(Test-Path Function:\$unBackup)) {
    Rename-Item Function:\Update-Name $unBackup
}

function update-name {
  & $unName
}

不幸的是,如果它是一个 CmdLet,它就不起作用。

【问题讨论】:

    标签: function powershell redefinition cmdlet


    【解决方案1】:

    您使用 cmdlet 的模块名称来消除名称的歧义:

    PS> Get-Command Start-Process | Format-Table ModuleName
    
    ModuleName
    ----------
    Microsoft.PowerShell.Management
    
    PS> Microsoft.PowerShell.Management\Start-Process Notepad
    

    【讨论】:

    • 是走这条路线还是走我从推特上收到的答案的路线更好(在这组答案中的某个地方)?
    • 两者都可以工作,除非您有多个同名的 cmdlet,在这种情况下,'Get-Command -Type Cmdlet` 将返回多个结果。我更喜欢我提出的方法,因为它更容易分辨您使用的是哪个cmdlet,因为相关的模块名称在脚本中拼写出来。
    • 对我来说已经足够了。谢谢先生。
    • 很好的例子:$oc = Get-Command 'Write-Host' -Module 'Microsoft.PowerShell.Utility'
    【解决方案2】:

    这也可以解决问题 - 感谢 Keith Dahlby! http://twitter.com/dahlbyk/status/55341994817503232

    $unName=Get-Command 'Update-Name' -CommandType Cmdlet;
    
    function update-name {
      & $unName
    }
    

    【讨论】:

    • 可能有多个名为 update-name 的 cmdlet。但是,如果您对其进行模块限定(根据上面基思的回答),碰撞的可能性要小得多。
    【解决方案3】:

    你能用proxy function吗?

    【讨论】:

      猜你喜欢
      • 2014-07-14
      • 2021-11-21
      • 1970-01-01
      • 1970-01-01
      • 2018-11-22
      • 2014-05-21
      • 2023-04-04
      • 1970-01-01
      • 2012-06-22
      相关资源
      最近更新 更多