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