gpt4 book ai didi

powershell - 如何将脚本 block 作为start-job中的参数之一传递

转载 作者:行者123 更新时间:2023-12-03 14:45:46 24 4
gpt4 key购买 nike

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

当我将脚本块传递给本地函数而不是通过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 - 如何将脚本 block 作为start-job中的参数之一传递,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11844390/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com