Powershell Start-Job调用带有参数的函数参数

时间:2018-11-25 17:31:37

标签: function powershell jobs start-job

我有一个函数mainFunction,它有2个参数-$name只是一个常规字符串,而$moveFunction是一些函数。

我想开始一个脚本块($SB)的工作,该脚本块将以$moveFunction作为参数来调用$name

function foo($a){
    Write-Output "In function foo with the argument => $a"
}

$SB = { 
        param($C, $fooFunction)
        $fooFunction.Invoke($C)
     } 

function mainFunction($name, $moveFunction){
    Start-Job  -Name "currentJob" -ArgumentList $name, ${Function:$moveFunction} -ScriptBlock $SB

}


$j1 = mainFunction -name "output!" -moveFunction $Function:foo

我检查了$moveFunction中已经存在mainFunction$moveFunction.invoke(5)处的mainFunction

在开始作业中将函数作为参数传递时,我找不到问题。

Get-Job -Name "CurrentJob" | Receive-Job中我得到:

You cannot call a method on a null-valued expression.
    + CategoryInfo          : InvalidOperation: (:) [], RuntimeException
    + FullyQualifiedErrorId : InvokeMethodOnNull
    + PSComputerName        : localhost

任何帮助将不胜感激。

编辑: 问题很可能是我将函数作为参数传递的方式(${Function:$moveFunction}

2 个答案:

答案 0 :(得分:1)

您传递并调用了相同的函数。您可以直接在作业中使用该功能。

Start-Job  -Name "currentJob" -ArgumentList $name - ScriptBlock ${function:foo}

答案 1 :(得分:1)

只是对我之前的注释和代码示例进行了重新表述。类似的问题here。本质上,传递给Jobs和Remote命令的参数是序列化的。在反序列化过程中,函数和脚本块以字符串形式出现,而不是其原始类型。幸运的是,使用[ScriptBlock]::Create("string")将它们转换为可调用的脚本块是一个简单的过程。

function foo {
    write-host "foo"
}

function bar {
    # This argument comes in as a string
    param($func)
    write-host "bar"

    # Create scriptblock from string
    $func = [ScriptBlock]::Create($func)
    $func.invoke()
}

Start-Job -ArgumentList $Function:Foo -ScriptBlock $Function:Bar

Get-Job | Wait-job
Get-Job | Receive-job