2011-04-25 51 views
4

我一直無法創建一個接受多個腳本塊參數PowerShell的功能。這是簡化的測試腳本。多個腳本塊有什麼問題?多個腳本塊Powershell的功能參數

function Task1 { 
    param([scriptblock]$f={}) 

    $f.Invoke() 
} 

function Task2 { 
    param([scriptblock]$f={}, [scriptblock]$k={}) 

    $f.Invoke() 
    $k.Invoke() 
} 

Task1({write-host "hello" -nonewline }) 
Task1({write-host " world" }) 
Task2({write-host "hello" -nonewline }, { write-host " world" }) 

這將產生以下的輸出:

hello world 
Task3 : Cannot process argument transformation on parameter 'f'. Cannot convert the "System.Object[]" value of type "S 
ystem.Object[]" to type "System.Management.Automation.ScriptBlock". 

回答

10

您的問題是,你調用函數時使用括號和逗號,在PowerShell中一個常見的錯誤。

這應該工作:

Task1 {write-host "hello" -nonewline } 
Task1 {write-host " world" } 
Task2 {write-host "hello" -nonewline } { write-host " world" } 
3

您也可以使用PowerShell的電話運營商 '&' 調用的腳本塊。作爲替代,我刪除了該參數的類型信息和初始化。如果腳本塊未被傳遞,這將產生不同的錯誤。

function Task1 { 
    param($f) 

    & $f 
} 

function Task2 { 
    param($f,$k) 

    & $f 
    & $k 
} 

Task1 {write-host "hello" -nonewline } 
Task1 {write-host " world" } 
Task2 {write-host "hello" -nonewline } { write-host " world" }