Start-Job -ScriptBlock:检索在ScriptBlock中编译的数组

时间:2014-12-10 22:27:35

标签: arrays powershell jobs

我在构建数组的ScriptBlock中有一个Foreach循环。 一旦完成,我无法弄清楚如何从作业中检索数组。

这是我目前的代码。

$HSMissingEmail = New-Object System.Collections.ArrayList
$HSDataObjects = New-Object System.Collections.ArrayList

$HSMissingEmail = Start-Job -Name HSMissingEmailStatus -ScriptBlock {
    param($HSDataObjects, $HSMissingEmail);
    foreach ($HSDO in $HSDataObjects) {
      $HSDO = $HSDO | Select-Object Name, Location, Telephone, EmailAddress, Comments;
      if ($HSDO | Where-Object {$_.EmailAddress -like ""}) {
        $HSMissingEmail.Add($HSDO)
      }
    }
  } -HSDataObjects $HSDataObjects -HSMissingEmail $HSMissingEmail | Receive-Job -Name HSMissingEmailStatus

我也试过以下但是它也没有做任何事情。

$HSMissingEmail = New-Object System.Collections.ArrayList
$HSDataObjects = New-Object System.Collections.ArrayList

$ScriptBlock = 
    {
        param($HSDataObjects,$HSMissingEmail)
        foreach ($HSDO in $HSDataObjects)
        {
            $HSDO = $HSDO | Select-Object Name, Location, Telephone, EmailAddress, Comments

            if ($HSDO | Where-Object {$_.emailaddress -like ""})
                {
                    $HSMissingEmail.Add($HSDO)
                }
        }
    }
    Start-Job -Name HSMissingEmailStatus -ScriptBlock $ScriptBlock -HSDataObjects $HSDataObjects -HSMissingEmail $HSMissingEmail
    ProgressBar ([REF]$HSMissingEmailStatus)
    $HSMissingEmail = Receive-Job -Name HSMissingEmailStatus
    Get-job -Name HSMissingEmailStatus | Remove-Job

我尝试了很多不同的方法来构建ScriptBlock但没有任何方法可以返回$ HSMissingEmail。

第二段代码也没有获取传递的数据,直到我将ScriptBlock全部放到一行,我不确定这是否是默认行为。

如何检索数组?

1 个答案:

答案 0 :(得分:1)

您需要将数组写出标准输出。

$HSMissingEmail = New-Object System.Collections.ArrayList
$HSDataObjects = New-Object System.Collections.ArrayList

$HSMissingEmail = Start-Job -Name HSMissingEmailStatus -ScriptBlock {
    param($HSDataObjects, $HSMissingEmail);
    foreach ($HSDO in $HSDataObjects) {
      $HSDO = $HSDO | Select-Object Name, Location, Telephone, EmailAddress, Comments;
      if ($HSDO | Where-Object {$_.EmailAddress -like ""}) {
        $HSMissingEmail.Add($HSDO)
      }
    }
    $HSMissingEmail    # Drops it out as a result of the script block
  } -HSDataObjects $HSDataObjects -HSMissingEmail $HSMissingEmail
Receive-Job -Name HSMissingEmailStatus -Wait  # At the appropriate time, or keep cycling until you get it all

就单行/多行位而言,未明确将变量键入为[ScriptBlock]可能会出现问题,但我必须检查。