将scriptblock重构为start-job的不同功能

时间:2013-05-24 14:13:26

标签: powershell

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

}

2 个答案:

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