我正在尝试创建一个后台任务,该任务执行一个脚本块。我需要将此脚本块作为参数传递,但似乎无法使语法正常工作。在此过程中,脚本块将转换为字符串。

当我将脚本块传递给本地函数而不是通过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/

10-12 07:06