在这种情况下,我所拥有的功能可以正常工作,但是我不禁感到必须有一种更快的方法来做到这一点。我在这里怀疑我的结构。您是否看到一种更快的方法? foreach
需要一段时间,因为它必须查询很多次。目标是要有一个数组来显示计算机的($poste
)集合(名称和对象路径)。
$poste = "p1234"
$SiteCode = "PRX"
$SiteServer = "SSX"
$ResourceID = Get-WmiObject -Namespace root\sms\site_$SiteCode -Computer $SiteServer -Class SMS_R_SYSTEM -Filter "Name='$poste'" |
Select-Object -ExpandProperty ResourceID
$CollectionIDs = Get-WmiObject -Namespace root\sms\site_$SiteCode -ComputerName $SiteServer -Class sms_fullcollectionmembership -Filter "ResourceID ='$resourceID'" |
Select-Object -expand CollectionID
foreach ($CollectionID in $CollectionIDs) {
$query = @"
SELECT * FROM SMS_Collection
WHERE SMS_Collection.CollectionID='$CollectionID'
"@
[array]$CollectionNamesPath += Get-WmiObject -Namespace root\sms\site_$SiteCode -Computer $SiteServer -Query $query |
Select-Object name,ObjectPath |
Sort-Object -Property Name
}
$CollectionNamesPath | Out-GridView
答案 0 :(得分:1)
这可能是您现有代码的最干净版本:
$poste = "p1234"
$SiteCode = "PRX"
$SiteServer = "SSX"
$ResourceID = Get-WmiObject -Namespace root\sms\site_$SiteCode -ComputerName $SiteServer -Class SMS_R_SYSTEM -Filter "Name='$poste'" -Property ResourceID | Select-Object -ExpandProperty ResourceID
$CollectionIDs = Get-WmiObject -Namespace root\sms\site_$SiteCode -ComputerName $SiteServer -Class sms_fullcollectionmembership -Filter "ResourceID='$resourceID'" -Property CollectionID | Select-Object -ExpandProperty CollectionID
$CollectionNamesPath = foreach ($CollectionID in $CollectionIDs) {
$Query = "Select Name, ObjectPath From SMS_Collection Where SMS_Collection.CollectionID='$CollectionID'"
Get-WmiObject -Namespace root\sms\site_$SiteCode -ComputerName $SiteServer -Query $Query | Select-Object Name, ObjectPath | Sort-Object -Property Name
}
$CollectionNamesPath | Out-GridView
您也可以尝试此操作,尽管我不确定WQL是否支持它:
$poste = "p1234"
$SiteCode = "PRX"
$SiteServer = "SSX"
$ResourceID = Get-WmiObject -Namespace root\sms\site_$SiteCode -ComputerName $SiteServer -Class SMS_R_SYSTEM -Filter "Name='$poste'" -Property ResourceID | Select-Object -ExpandProperty ResourceID
$CollectionIDs = Get-WmiObject -Namespace root\sms\site_$SiteCode -ComputerName $SiteServer -Class sms_fullcollectionmembership -Filter "ResourceID='$resourceID'" -Property CollectionID | Select-Object -ExpandProperty CollectionID
$Query = "Select CollectionID, Name, ObjectPath From SMS_Collection Where" + $($($CollectionIDs | ForEach-Object { " SMS_Collection.CollectionID='$_' " }) -join 'or')
$CollectionNamesPath = Get-WmiObject -Namespace root\sms\site_$SiteCode -ComputerName $SiteServer -Query $Query |
Sort-Object -Property CollectionID, Name |
Select-Object Name, ObjectPath
$CollectionNamesPath | Out-GridView
您也许可以执行以下操作:
Get-CimInstance -Namespace root\sms\site_$SiteCode -ComputerName $SiteServer -Class SMS_R_SYSTEM -Filter "Name='$poste'" -KeyOnly |
Get-CimAssociatedInstance -ComputerName $SiteServer -ResultClassName sms_fullcollectionmembership -KeyOnly |
Get-CimAssociatedInstance -ComputerName $SiteServer -ResultClassName SMS_Collection |
Sort-Object -Property CollectionID, Name |
Select-Object Name, ObjectPath
当它起作用时,这太棒了。但是,根据我的经验,Get-CimAssociatedInstance
的使用体验充其量是不均衡的,而在远程计算机上使用时则更是如此。