I've been successfully passing no-argument functions around in PowerShell using ScriptBlocks. However, I can't get this to work if the function has arguments. Is there a way to do this in PowerShell? (v2 preferably)
Function Add([int] $x, [int] $y)
{
return $x + $y
}
Function Apply([scriptblock] $s)
{
write-host ($s.Invoke(1,2))
}
Then
Apply { Add }
writes 0 to the console. Apply does invoke Add
, but doesn't pass any arguments in (i.e. uses the default [int] values of 0 and 0)
Ok, I found the answer here:
I wanted ${function:Add}
rather than { Add }
in the call to Apply
.
There is a much cleaner way to do this using the PowerShell function provider. I needed to be able to run functions from other source files with variable numbers of arguments based on an XML file provided at run time.
In developing this I wrote a small "Hello World" tester in two source files which should be fairly self-explanatory (the magic line is "$x = (& $func $parm)"):
- "Hello.ps1" - The remote function
function Hello ($in) {
write-Host "Hello $in"
}
- "Hello2.ps1" - The executing routine
function exec-script ($file, $func, $parm) {
Invoke-Expression $file
$x = (& $func $parm)
$x
}
exec-script -file ".\Hello" -func "Hello" -parm "World"
Don't you want to do something like this?
function Add([int] $x, [int] $y)
{
return $x + $y
}
function Apply([scriptblock] $s)
{
Write-Host $s.Invoke($args)
}
Apply { Add 1 2}
来源:https://stackoverflow.com/questions/18569518/pass-a-function-with-arguments-as-a-parameter-in-powershell