2011-04-25 6 views
4

하나 이상의 scriptblock 매개 변수를 사용할 수있는 Powershell 함수를 만들 수 없습니다. 다음은 간단한 테스트 스크립트입니다. 여러 scriptblock 문제는 무엇입니까?복수 스크립트 블록 매개 변수가있는 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" } 
관련 문제