2014-03-02 81 views
24

我写了函数'A',它将调用其他函数之一。为了保存重写函数'A',我想传递函数作为函数'A'的参数。例如:PowerShell:传递函数作为参数

function A{ 
    Param($functionToCall) 
    Write-Host "I'm calling : $functionToCall" 
} 

function B{ 
    Write-Host "Function B" 
} 

Function C{ 
    write-host "Function C" 
} 

A -functionToCall C 

返回:我打电话:C

我期待它返回:我打电话:功能C.

我已经尝试了各种东西,如:

Param([scriptblock]$functionToCall) 

无法转换System.String要脚本块

A -functionToCall $function:C 

返回“写主机‘功能C’

A - functionToCall (&C) 

这个评估它的其余部分之前:

Function C 
I'm Calling : 

我敢肯定,这是程序101,但我不能工作了正确的语法或者我做错了什么。任何帮助将受到感谢。非常感谢。

回答

6

这是你需要的吗?

function A{ 
    Param($functionToCall) 
    Write-Host "I'm calling : $functionToCall" 

    #access the function-object like this.. Ex. get the value of the StartPosition property 
    (Get-Item "function:$functionToCall").ScriptBlock.StartPosition 

} 

function B{ 
    Write-Host "Function B" 
} 

Function C{ 
    write-host "Function C" 
} 


PS> a -functionToCall c 

I'm calling : c 


Content  : Function C{ 
        write-host "Function C" 
       } 
Type  : Position 
Start  : 307 
Length  : 43 
StartLine : 14 
StartColumn : 1 
EndLine  : 16 
EndColumn : 2 
+1

不,这只是将字符串“c”传递给函数,它不会传递函数对象C作为参数。 – Duncan

+0

问题不清楚。看到更新的答案。使用scriptblock-property你也可以调用传递函数 –

+0

Spot on。非常感谢你@Frode F.非常感谢。如此简单,当你知道如何。 – woter324

31

我不知道这是最好的,但是:

function A{ 
    Param([scriptblock]$functionToCall) 
    Write-Host "I'm calling $($functionToCall.Invoke(4))" 
} 

function B($x){ 
    Write-Output "Function B with $x" 
} 

Function C{ 
    Param($x) 
    write-Output "Function C with $x" 
} 

PS C:\WINDOWS\system32> A -functionToCall $function:B 
I'm calling Function B with 4 

PS C:\WINDOWS\system32> A -functionToCall $function:C 
I'm calling Function C with 4 

PS C:\WINDOWS\system32> A -functionToCall { Param($x) "Got $x" } 
I'm calling Got x 
+0

“4”代表什么,如.Invoke(4)?谢谢。 – woter324

+1

只是说明您可以在调用函数时传递参数 – Duncan

+2

难道您没有恰当地将它包裹起来以解释破折号? A -functionToCall $ {Function:Execute-FunctionWithDash} – dwarfsoft

3

邓肯的解决方案为我工作的伟大。但是,当函数名称中有一个短划线时,我遇到了一些问题。

我能够通过建立了他的第三个例子绕过它:

function A{ 
    Param([scriptblock]$functionToCall) 
    Write-Host "I'm calling $($functionToCall.Invoke(4))" 
} 

function Execute-FunctionWithDash($x) 
{ 
    Write-Output "Function Execute-FunctionWithDash with $x" 
} 

PS C:\WINDOWS\system32> A -functionToCall { Param($x) Execute-FunctionWithDash $x } 
I'm calling Function Execute-FunctionWithDash with 4 
+0

这样你就传递了$ x,但不是那些不需要的行为。 – f0rt

+0

实际上最后一行是调用函数A并传递一个函数,该函数接受一个参数$ x,调用Execute-FunctionWithDash,并将参数$ x传递给它。 – Daryl

2

你有没有想过传递ScriptBlock作为参数?

$scriptBlock = { Write-Host "This is a script block" } 
Function f([ScriptBlock]$s) { 
    Write-Host "Invoking ScriptBlock: " 
    $s.Invoke() 
} 

PS C:\> f $scriptBlock 
Invoking ScriptBlock: 
This is a script block