Powershell Start-job 调用带有参数的函数参数
Powershell Start-job invoke function argument with parameter
我有一个获取 2 个参数的函数 mainFunction
- $name
将只是一个常规字符串,而 $moveFunction
将是某个函数。
我想开始一个 ScriptBlock ($SB
) 的工作,它将以 $name
作为参数调用 $moveFunction
。
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}
您传递了相同的函数并调用了它。您可以直接在作业中使用该功能。
Start-Job -Name "currentJob" -ArgumentList $name - ScriptBlock ${function:foo}
只是重复我之前的评论加上代码示例。类似问题here。本质上,传递给作业和远程命令的参数是序列化的。在反序列化过程中,函数和脚本块以字符串形式出现,而不是它们的原始类型。幸运的是,使用 [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
我有一个获取 2 个参数的函数 mainFunction
- $name
将只是一个常规字符串,而 $moveFunction
将是某个函数。
我想开始一个 ScriptBlock ($SB
) 的工作,它将以 $name
作为参数调用 $moveFunction
。
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}
您传递了相同的函数并调用了它。您可以直接在作业中使用该功能。
Start-Job -Name "currentJob" -ArgumentList $name - ScriptBlock ${function:foo}
只是重复我之前的评论加上代码示例。类似问题here。本质上,传递给作业和远程命令的参数是序列化的。在反序列化过程中,函数和脚本块以字符串形式出现,而不是它们的原始类型。幸运的是,使用 [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