2011-04-25 5 views
4

J'ai été incapable de créer une fonction Powershell qui accepte plus d'un paramètre scriptblock. Voici le script de test simplifié. Quel est le problème avec plusieurs scriptsblocks?Fonction Powershell avec plusieurs paramètres de scriptblock

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" }) 

Ce produit la sortie suivante:

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". 

Répondre

10

Votre problème est que vous utilisez entre parenthèses et des virgules lors de l'appel des fonctions, une erreur commune dans Powershell.

Ceux-ci devraient travailler:

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

Vous pouvez également appeler le scriptblock avec l'opérateur d'appel PowerShell '&'. Comme alternative, j'ai enlevé l'information de type et l'initialisation de ces paramètres. Cela produirait des erreurs différentes si un scriptblock n'a pas été passé.

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" } 
Questions connexes