【问题标题】:Start-Job -ScriptBlock: Retrieving an array that is compiled inside the ScriptBlockStart-Job -ScriptBlock:检索在 ScriptBlock 内编译的数组
【发布时间】:2014-12-10 22:27:35
【问题描述】:

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

这是我当前的代码。

$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 全部设为一行之前,第二个代码块不会获得传递的数据,我不确定这是否是默认行为。

如何检索数组?

【问题讨论】:

    标签: arrays powershell jobs


    【解决方案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] 可能会出现问题,但我必须检查一下。

    【讨论】:

    • 还需要澄清一下,您使用的是Receive-Job 而不是Get-Job(Rec 获取返回的数据,Get 获取作业对象)。如果 Devin 以后想这样做,您也可以将 -AutoRemoveJob arg 添加到 rcjb。
    • @Nathan-Tuggy 我已经获得了 $HSMissingEmail 变量来包含该作业,但是每当我对其执行 Receive-Job 时,即使 HasData 字段为真,也不会返回任何内容。
    • 嗯,我在代码中发现了一个相当不幸的故障:通过 Receive-Job 进行管道传输毫无意义。立即尝试。
    • @NathanTuggy 不幸的是它没有改变任何东西。我相信我会放弃使用 Job 并简单地执行 foreach 循环。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-09
    • 1970-01-01
    • 2023-01-28
    • 2017-06-20
    • 2017-05-25
    相关资源
    最近更新 更多