Функция Powershell с несколькими параметрами скрипт-блока - PullRequest
4 голосов
/ 26 апреля 2011

Мне не удалось создать функцию Powershell, которая принимает более одного параметра 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" })

Это дает следующий вывод:

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

Ответы [ 2 ]

10 голосов
/ 26 апреля 2011

Ваша проблема в том, что вы используете круглые скобки и запятые при вызове функций, что является распространенной ошибкой в ​​powershell.

Это должно работать:

Task1 {write-host "hello" -nonewline } 
Task1 {write-host " world" }
Task2 {write-host "hello" -nonewline }  { write-host " world" }
3 голосов
/ 26 апреля 2011

Вы также можете вызвать блок сценариев с помощью оператора вызова 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" }
...