Сбор данных с заданиями внутри цикла ForEach-Object - PullRequest
0 голосов
/ 25 февраля 2019

Цель состоит в том, чтобы иметь объект, который отображает информацию о коллекциях компьютера ($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

Все, что я получаю в окне сетки, это имена заданий (job1, job3 и т. Д.).

Если я делаю это "нормально"без заданий работает нормально, но требует времени для завершения, поэтому моя идея запускать команды в ForEach-Object как заданиях.

Например, если я делаю это, я получаю нужные результаты:

$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-Object?

РЕДАКТИРОВАТЬ: Благодаря приведенному ниже ответу, вот последний код, который я использовал, которыйнемного отличается:

$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

1 Ответ

0 голосов
/ 25 февраля 2019

Вам необходимо передать переменные, которые были определены вне задания, в задание:

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...