我正在尝试创建一个执行脚本块的后台作业.我需要将此scriptblock作为参数传递,但我似乎无法使语法工作.脚本块正在转换为沿途的某个字符串.
当我将脚本块传递给本地函数时,它工作正常,但不是通过启动作业
以下语法有效:
function LocalFunction
{
param (
[parameter(Mandatory=$true)]
[ScriptBlock]$ScriptBlock
)
&$ScriptBlock | % { echo "got $_" }
}
LocalFunction -ScriptBlock { echo "hello" }
Run Code Online (Sandbox Code Playgroud)
这按预期输出"得到你好".
但是以下失败了:
$job = start-job -argumentlist { echo "hello" } -scriptblock {
param (
[parameter(Mandatory=$true)]
[ScriptBlock]$ScriptBlock
)
&$ScriptBlock | % { echo "got $_" }
}
start-sleep -s 1
receive-job $job
Run Code Online (Sandbox Code Playgroud)
它返回的错误是
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".
Run Code Online (Sandbox Code Playgroud)
因此,如果我正确地读错误,那么似乎-argumentlist会以某种方式将其参数强制转换为字符串.
任何powershell专家知道如何使这种语法工作?
提前致谢,
本
Sha*_*evy 15
这是解决此问题的一种方法,将scriptblock代码作为字符串传递,然后从作业内的字符串创建一个scriptblock并执行它
Start-Job -ArgumentList "write-host hello" -scriptblock {
param (
[parameter(Mandatory=$true)][string]$ScriptBlock
)
& ([scriptblock]::Create($ScriptBlock))
} | Wait-Job | Receive-Job
Run Code Online (Sandbox Code Playgroud)
看来今天这个办法有效。
function LocalFunction
{
param
(
[scriptblock] $block
)
$block.Invoke() | % { "got $_" }
}
LocalFunction { "Hello"}
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
25908 次 |
最近记录: |