1

是否可以将脚本块包含在与包含 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

}
4

2 回答 2

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
于 2013-05-24T14:48:51.253 回答
0

for 的参数-ScriptBlock必须是一个脚本块。但是,您的函数不会返回脚本块,而是返回Start-Processcmdlet 的结果。将其更改为实际返回一个脚本块:

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. 另请注意,当您的脚本块需要两个字符串参数时,参数列表必须是两个字符串的数组。

于 2013-05-24T19:27:17.457 回答