在this technique to use Cmdlets as "delegates"的基础上,我留下了这样的问题:
有没有办法将具有指定命名或位置参数的命令小程序传递给另一个使用powershell管道将其余参数绑定到已传递的命令小程序的命令小程序?
下面是我希望能够运行的代码片段:
Function Get-Pow{
[CmdletBinding()]
Param([Parameter(ValueFromPipeline=$true)]$base,$exp)
PROCESS{[math]::Pow($base,$exp)}
}
Function Get-Result{
[CmdletBinding()]
Param([Parameter(ValueFromPipeline=$true)]$x,$Cmdlet)
$x | . $Cmdlet
}
10 | Get-Result -Cmdlet 'Get-Pow -exp 2'
10 | Get-Result -Cmdlet 'Get-Pow -exp 3'
10 | Get-Result -Cmdlet Get-Pow -exp 2
10 | Get-Result -Cmdlet Get-Pow -exp 3对Get-Result的前两个调用会导致CommandNotFoundException,因为Get-Pow -exp 2“不是cmdlet的名称”。
最后两个对Get-Result的调用导致了NamedParameterNotFound,Get-Result,因为该语法实际上是试图将参数-exp传递给Get-Result,而它没有这个参数。
有没有其他方法可以设置它,使其正常工作?
发布于 2015-02-13 04:51:58
我不确定这是不是最好的方法,但至少它自始至终都很像powershell的习惯用法:
Function Get-Amount{
[CmdletBinding()]
Param(
[Parameter(ValueFromPipeline=$true)]$t,
[Parameter(position=1)]$r,
[Parameter(position=2)]$P)
PROCESS{$P*[math]::Pow(1+$r,$t)}
}
Function Get-Result{
[CmdletBinding()]
Param(
[Parameter(ValueFromPipeline=$true)]$x,
[Parameter(Position=1)]$Cmdlet, #positional arguments here makes calling more readable
[Alias('args')] #careful, $args is a special variable
[Parameter(Position=2)]$Arguments=@()) #the default empty array is required for delegate style 1
PROCESS{
#invoke style 1 #works with delegate styles 1,2,3
iex "$x | $Cmdlet @Arguments"
#invoke style 2 #works with delegate styles 2,3
$x | . $Cmdlet @Arguments
}}
5,20 | Get-Result 'Get-Amount -r 0.05 -P 100' #delegate style 1
5,20 | Get-Result Get-Amount 0.05,100 #delegate style 2
5,20 | Get-Result Get-Amount @{r=0.05;P=100} #delegate style 3这会导致:
127.62815625
CommandNotFoundException
265.329770514442
CommandNotFoundException
127.62815625
127.62815625
265.329770514442
265.329770514442
127.62815625
127.62815625
265.329770514442
265.329770514442https://stackoverflow.com/questions/28486411
复制相似问题