我正在尝试创建一个后台任务,该任务执行一个脚本块。我需要将此脚本块作为参数传递,但似乎无法使语法正常工作。在此过程中,脚本块将转换为字符串。
当我将脚本块传递给本地函数而不是通过start-job时,它可以正常工作
以下语法有效:
function LocalFunction
{
param (
[parameter(Mandatory=$true)]
[ScriptBlock]$ScriptBlock
)
&$ScriptBlock | % { echo "got $_" }
}
LocalFunction -ScriptBlock { echo "hello" }
这将按预期输出“打招呼”。
但是以下失败:
$job = start-job -argumentlist { echo "hello" } -scriptblock {
param (
[parameter(Mandatory=$true)]
[ScriptBlock]$ScriptBlock
)
&$ScriptBlock | % { echo "got $_" }
}
start-sleep -s 1
receive-job $job
它返回的错误是
Receive-Job : Cannot process argument transformation on parameter 'ScriptBlock'. Cannot convert the " echo "hello" " value of type "System.String" to type "System.Management.Automation.ScriptBlock".
因此,如果我没看错,看来-argumentlist会以某种方式将其参数强制为字符串。
任何Powershell专家都知道如何使此语法起作用?
提前致谢,
本
最佳答案
这是解决此问题的一种方法,将脚本块代码作为字符串传递,然后从作业内部的字符串创建脚本块并执行它
Start-Job -ArgumentList "write-host hello" -scriptblock {
param (
[parameter(Mandatory=$true)][string]$ScriptBlock
)
& ([scriptblock]::Create($ScriptBlock))
} | Wait-Job | Receive-Job
关于powershell - 如何将脚本块作为start-job中的参数之一传递,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/11844390/