【问题标题】:Is there a way to create a Cmdlet "delegate" that supports pipeline parameter binding?有没有办法创建一个支持管道参数绑定的 Cmdlet“委托”?
【发布时间】:2015-02-12 16:23:38
【问题描述】:

在 .NET 中,如果您的子例程的实现可能会从一个调用更改为另一个调用,则可以将委托传递给使用该子例程的方法。 You can also do this in Powershell。您还可以使用have been described as Powershell's equivalent of anonymous functions 的脚本块。然而,惯用的 powershell 使用了 powershell 的管道参数绑定。但委托和脚本块似乎都没有使用 Powershell 的管道参数绑定。

是否有一种(惯用的)方法可以将 powershell commandlet 传递给另一个 commandlet,同时保留对管道参数绑定的支持?

这是我想做的代码 sn-p:

Function Get-Square{
    [CmdletBinding()] 
    Param([Parameter(ValueFromPipeline=$true)]$x)
    PROCESS{$x*$x}
}
Function Get-Cube{
    [CmdletBinding()] 
    Param([Parameter(ValueFromPipeline=$true)]$x)
    PROCESS{$x*$x*$x}
}
Function Get-Result{
    [CmdletBinding()]
    Param([Parameter(ValueFromPipeline=$true)]$x,$Cmdlet)
    PROCESS{$x | $Cmdlet}
}

10 | Get-Result -Cmdlet {Get-Square}
10 | Get-Result -Cmdlet {Get-Cube}

【问题讨论】:

    标签: powershell delegates pipeline scriptblock


    【解决方案1】:

    那行得通。您的函数定义和传递参数的方式出现了一些语法问题:

    Function Get-Square{
        [CmdletBinding()] 
        Param([Parameter(ValueFromPipeline=$true)]$x)
        $x*$x
    }
    Function Get-Cube{
        [CmdletBinding()] 
        Param([Parameter(ValueFromPipeline=$true)]$x)
        $x*$x*$x
    }
    Function Get-Result{
        [CmdletBinding()]
        Param([Parameter(ValueFromPipeline=$true)]$x,$Cmdlet)
        $x | . $cmdlet
    }
    
    10 | Get-Result -Cmdlet Get-Square
    10 | Get-Result -Cmdlet Get-Cube
    
    100
    1000
    

    【讨论】:

    • 有趣。所以$Cmdlet[string]。而. 用于"dot source"[string] 并在Get-Result 的上下文中将其作为脚本执行。对吗?
    • 几乎正确。这是一个函数调用,而不是脚本块调用。这是一个 [string],因为函数名是 [string]。
    • 嗯...我试图围绕“这是一个函数调用”的含义来思考。我还确定我实际上还需要在传递 cmdlet 时传递命名参数和位置参数。这是相关的,但并不真正适合这个问题,所以I asked it here.
    • 关于唯一的含义是你传递什么样的参数。因为它是一个命名函数,所以您可以只传递名称。如果它是“未命名”或匿名函数,则需要传递脚本块。
    • 现在这一切都说得通了。谢谢你的帮助。 :)
    猜你喜欢
    • 2011-10-06
    • 1970-01-01
    • 2015-07-06
    • 1970-01-01
    • 2013-04-10
    • 2015-03-20
    • 1970-01-01
    • 1970-01-01
    • 2022-01-23
    相关资源
    最近更新 更多