Reputation: 24938
I have been unable to create a Powershell function that accepts more than one scriptblock parameter. Here's the simplified test script. What is the issue with multiple 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" })
This produces the following output:
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".
Upvotes: 4
Views: 3924
Reputation: 6823
You can also invoke the scriptblock with the PowerShell call operator '&'. As an alternative, I removed the type information and initialization of that parameters. This would produce different errors if a scriptblock was not passed.
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" }
Upvotes: 3
Reputation: 18166
Your problem is that you are using parentheses and commas when calling functions, a common mistake in powershell.
These should work:
Task1 {write-host "hello" -nonewline }
Task1 {write-host " world" }
Task2 {write-host "hello" -nonewline } { write-host " world" }
Upvotes: 11