2014-03-02 106 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