我无法创建一个接受多个scriptblock参数的Powershell函数。这是简化的测试脚本。多个scriptblocks有什么问题?
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".
答案 0 :(得分:10)
你的问题是你在调用函数时使用括号和逗号,这是powershell中常见的错误。
这些应该有效:
Task1 {write-host "hello" -nonewline }
Task1 {write-host " world" }
Task2 {write-host "hello" -nonewline } { write-host " world" }
答案 1 :(得分:3)
您还可以使用PowerShell调用运算符'&'调用scriptblock。作为替代方案,我删除了该参数的类型信息和初始化。如果未传递scriptblock,则会产生不同的错误。
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" }