4

我一直无法创建一个接受多个 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".
4

2 回答 2

10

您的问题是您在调用函数时使用了括号和逗号,这是 powershell 中的一个常见错误。

这些应该工作:

Task1 {write-host "hello" -nonewline } 
Task1 {write-host " world" }
Task2 {write-host "hello" -nonewline }  { write-host " world" }
于 2011-04-25T23:08:38.523 回答
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" }
于 2011-04-26T00:15:02.757 回答