Powershell 在ForEach对象循环内使用作业收集数据

Powershell 在ForEach对象循环内使用作业收集数据,powershell,loops,jobs,start-job,foreach-object,Powershell,Loops,Jobs,Start Job,Foreach Object,目标是有一个显示计算机($poste)集合信息的对象。我正试图通过作业收集这些数据,以便它运行得更快。然而,我正在努力使它正确。我正在努力: $poste = "xx" $SiteCode = "XX" $SiteServer = "XX" $ResourceID = Get-WmiObject -Namespace root\sms\site_$SiteCode -Computer $SiteServer -Class SMS_R_SYSTEM -Filter "Name='$poste'"

目标是有一个显示计算机(
$poste
)集合信息的对象。我正试图通过作业收集这些数据,以便它运行得更快。然而,我正在努力使它正确。我正在努力:

$poste = "xx"
$SiteCode = "XX"
$SiteServer = "XX"

$ResourceID = Get-WmiObject -Namespace root\sms\site_$SiteCode -Computer $SiteServer -Class SMS_R_SYSTEM -Filter "Name='$poste'" |
              Select-Object -ExpandProperty ResourceID

$NomsCollection = Get-WmiObject -Namespace root\sms\site_$SiteCode -ComputerName $SiteServer -Class sms_fullcollectionmembership -Filter "ResourceID ='$resourceID'" |
                  ForEach-Object {
                      Invoke-Command -ScriptBlock {
                          Get-WmiObject -Namespace root\sms\site_$SiteCode -Computer $SiteServer -Class SMS_COllection -Filter "CollectionID='$($_.CollectionID)'"
                      } -Computer localhost -AsJob
                      Get-Job | Receive-Job
                  }

$NomsCollection |
    Select-Object CollectionID, Name, Comment, ObjectPath |
    Sort-Object -Property Name |
    Out-GridView -Title $poste -Wait
在gridview中,我最后看到的是作业的名称(job1、job3等)

如果我“正常”执行,没有作业,它工作正常,但需要一段时间才能完成,因此我的想法是将
ForEach对象中的命令作为作业运行

例如,如果我这样做,我会得到我想要的结果:

$poste = "xx"
$SiteCode = "xx"
$SiteServer = "xx"

$ResourceID = Get-WmiObject -Namespace root\sms\site_$SiteCode -computer $SiteServer -Class SMS_R_SYSTEM -Filter "Name='$poste'" |
              Select-Object -ExpandProperty ResourceID

$NomsCollection = Get-WmiObject -Namespace root\sms\site_$SiteCode -ComputerName $SiteServer -Class sms_fullcollectionmembership -Filter "ResourceID ='$resourceID'" |
                  ForEach-Object {
                      Get-WmiObject -Namespace root\sms\site_$SiteCode -Computer $SiteServer -Class SMS_COllection -Filter "CollectionID='$($_.CollectionID)'"
                  }

$NomsCollection |
    Select-Object CollectionID, Name, Comment, ObjectPath |
    Sort-Object -Property Name |
    Out-GridView -Title $poste -Wait
在处理
ForEach对象中的作业时,我缺少了什么

编辑:多亏了下面的答案,这里是我使用的最终代码,略有不同:

$SiteCode = "xx"
$SiteServer = "xx"

$ResourceID = Get-WmiObject -Namespace root\sms\site_$SiteCode -computer $SiteServer -Class SMS_R_SYSTEM -Filter "Name='$poste'" |
Select-Object -ExpandProperty ResourceID

$jobs = Get-WmiObject -Namespace root\sms\site_$SiteCode -ComputerName $SiteServer -Class sms_fullcollectionmembership -Filter "ResourceID ='$resourceID'" |
ForEach-Object {
    Start-Job -ArgumentList $SiteServer, $SiteCode, $_.CollectionID -ScriptBlock {
        Param ($server,$code,$id)
        Get-WmiObject -Namespace root\sms\site_$code -Computer $server -Class SMS_COllection -Filter "CollectionID='${id}'"
    } 
}

$NomsCollection = $jobs | Get-Job | Wait-Job | Receive-Job


$NomsCollection | Select-Object CollectionID, Name, Comment, ObjectPath | Sort-Object -Property Name | Out-GridView -Title $poste -Wait

您需要将作业外部定义的变量传递到作业中:

Invoke-Command -ScriptBlock {
    Param($server, $code, $id)
    Get-WmiObject -Namespace root\sms\site_$code -Computer $server -Class SMS_COllection -Filter "CollectionID='${id}'"
} -Computer localhost -ArgumentList $SiteServer, $SiteCode, $_.CollectionID -AsJob
此外,在收集输出之前,您需要等待作业完成:

$jobs = Get-WmiObject -Namespace ... | ForEach-Object {
    Invoke-Command ...
}
$NomsCollection = $jobs | Get-Job | Wait-Job | Receive-Job

非常感谢,真不敢相信我忘记了论点清单:)