是否可以让脚本块包含在与包含start-job方法的函数不同的函数中?
我正在寻找的是:
function Get-jobA
{
$params="data1,data2"
$jobs += Start-Job -ScriptBlock Get-MyScriptBlock -ArgumentList $params
}
function Get-MyScriptBlock
{
[string]param1,[string]param2 = $args
Start-Process -FilePath <someFile> -ArgumentList 'param1,param2' -PassThru -Wait
}
答案 0 :(得分:3)
作业有自己的作用域,因此需要先在其中定义该作用,然后才能使用它。您可以使用InitializationScript参数在作业内传递函数定义,使用以下语法。
$functions = {
function Get-MyScriptBlock
{
return "Hello!";
}
}
function Get-jobA
{
$job = Start-Job -InitializationScript $functions
-ScriptBlock { Get-MyScriptBlock } | Wait-Job | Receive-Job
Write-Host $job;
}
Get-jobA
答案 1 :(得分:0)
-ScriptBlock
的参数必须是脚本块。但是,您的函数不会返回脚本块,而是返回Start-Process
cmdlet的结果。将其更改为实际返回脚本块:
function Get-MyScriptBlock {
return {
Param([string]param1, [string]param2)
Start-Process -FilePath <someFile> -ArgumentList $param1, $param2 `
-PassThru -Wait
}
}
并像这样修改Get-JobA
:
function Get-jobA {
$params = "data1", "data2"
$jobs += Start-Job -ScriptBlock (Get-MyScriptBlock) -ArgumentList $params
}
请注意Get-MyScriptBlock
周围的括号。您需要在子shell中执行该函数,否则PowerShell会将-ArgumentList $params
解释为Get-MyScriptBlock
而不是Start-Job
的参数。另请注意,当脚本块需要两个字符串参数时,参数列表必须是两个字符串的数组。