【问题标题】:How do I write a wrapper powershell command that forwards all arguments to a delegate command?如何编写将所有参数转发给委托命令的包装器 powershell 命令?
【发布时间】:2018-11-23 10:01:28
【问题描述】:

wrapper 应该只是调用 delegate,将传递给 wrapper 的参数转发。

给定

.\wrapper.ps1 1 2

delegate.ps1 内容:

param($one, $two)
write-host "one=$one and two=$two"

那么期望输出是:

one=1 and two=2

wrapper.ps1 内容:

.\delegate # How do I forward all args passed to this wrapper script to the delegate script?

如果我尝试以下 wrapper.ps1 的实现:

.\delegate $args

输出错误:

one=1 2 and two=

【问题讨论】:

    标签: powershell parameter-passing


    【解决方案1】:

    你要找的是Splatting

    使用@符号

    .\delegate @args
    
    【解决方案2】:

    PowerShell 提供了一个ProxyCommand 类,旨在简化此操作。要为命令生成包装函数的文本,比如MyCommand,您可以这样做

    $wrapper = [System.Management.Automation.ProxyCommand]::Create((get-command MyCommand))
    

    【讨论】:

    • 我必须调查一下。谢谢!
    • 这是更好的答案。 $wrapper 然后包含一个非常全面的目标命令包装器,然后您可以对其进行修改以适应。
    • 嘿,布鲁斯P。你发的那条线不应该是这样吗? ... $MyCommand = New-Object System.Management.Automation.CommandMetaData (Get-Command Get-Service);($wrapper = [System.Management.Automation.ProxyCommand]::Create($MyCommand)) ... 否则该行本身将因“get-command”而失败:术语“MyCommand”未被识别为 cmdlet 的名称,”
    • 在我的示例中,我使用“MyCommand”作为用户想要包装的实际命令的占位符。因此,例如,如果该命令是 Get-Service,那么它将是 $wrapper = [System.Management.Automation.ProxyCommand]::Create((Get-Command Get-Service))
    • 另外值得注意的是,System.Management.Automation.ProxyCommand 还有一些其他方法,它们返回包装函数文本的各个块(cmdletbindingparambeginprocessend 等)。这在自动生成大量包装函数时会派上用场,因为在将它们连接到完整的函数文本之前,可以轻松地用自定义代码包围这些块(或进行一些搜索/替换)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-16
    • 1970-01-01
    • 2017-12-21
    • 1970-01-01
    相关资源
    最近更新 更多