【发布时间】:2019-02-22 13:57:47
【问题描述】:
在这种情况下,我的工作正常,但我不禁觉得必须有更快的方法来做到这一点。我在这里怀疑我的结构。您是否看到了一种更快的方法可以做到这一点? 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
【问题讨论】:
-
如果项目的数量“大”,那么这个
[array]$CollectionNamesPath +=将使循环在每次通过时运行得更慢。数组+=不添加......它创建一个新的一项更大的数组,将旧的复制到新的,插入新的项目,然后删除旧的。正如您所猜测的那样,随着数组变大,它会变得非常慢。通常的解决方案是使用$Collection = foreach (将整个结果集一次性放入数组中。 -
嗨,李!好点,我不禁觉得必须有更好的方法来解决这个问题,也许是 SCCM CMDlets?
-
我对 SCCM cmdlet 一无所知……但是,希望它们得到优化。 [grin] 我会试一试...
-
Invoke-Command将同时运行多个命令。
标签: powershell wmi wql get-wmiobject