2014-10-19 64 views
0

如下面的代码所示,我最终为网站集中的每个网站创建了一个新的PSObject。最终,我需要为多个SharePoint Web应用程序运行这个应用程序,每个应用程序包含多个站点,总站点跨越2000个。所以这是很多PSObjects创建的。如何处理PSObject

PSObject没有dispose函数,所以我的选项是让代码更高效并处理对象。

同样,每次我执行操作$SiteInfoCollection += $object时,都会重新分配内存,因为它是一个动态扩展数组。根据几个月前我读过的一篇文章,任何内存重新分配操作都很昂贵,对性能不利。有没有办法让这一步有效?

$SPWebApp = Get-SPWebApplication "http://portal.contoso.com" 

$SiteInfoCollection = @() 

foreach($site in $SPWebApp.sites) 
    { 
     $object = New-Object PSObject 
     Add-Member -InputObject $object -MemberType NoteProperty -Name URL -Value "" 
     Add-Member -InputObject $object -MemberType NoteProperty -Name Title -Value "" 
     Add-Member -InputObject $object -MemberType NoteProperty -Name Template -Value "" 

     $object.url = $site.url 
     $object.title = $site.rootweb.title 
     $object.template = $site.rootweb.WebTemplate 

     $SiteInfoCollection += $object 

     #$object.Dispose() #NOT valid operation 
    } 
    $site.Dispose() 
} 
$SiteInfoCollection 

回答

0

该对象在进行此操作时将被垃圾收集。它不是一个包含COM数据库连接的重磅SharePoint对象,因此不需要处理。

想要把$ site放置在foreach循环中。

对于大多数的SharePoint PowerShell命令,你可以用-AssignmentCollections,而不是手动配置:

管理对象以便正确处置为目的的。使用诸如SPWeb或SPSite等对象可以使用大量内存,并且在Windows PowerShell脚本中使用这些对象需要进行适当的内存管理。使用SPAssignment对象,您可以将对象分配给变量,并在需要释放内存后处置这些对象。当使用SPWeb,SPSite或SPSiteAdministration对象时,如果未使用分配集合或Global参数,则会自动处理这些对象。

更PowerShell的方式来获得同样的functionallity将

$gc = Start-SPAssignment 
Get-SPSite "http://portal.contoso.com" -Limit All -AssignmentCollection $gc | % { 
    # Loop 
} 
Stop-SPAssignment -Identity $gc 
+0

'GET-SPSite'返回单个'Microsoft.SharePoint.SPSite'对象的集合。 '$ SPWebApp.Sites'返回'Microsoft.SharePoint.Administration.SPSiteCollection',我认为它不像前者那样占用内存。 foreach循环只创建一个SPSite对象,该对象用于获取集合中每个SPSite的属性。这就是为什么我在foreach循环外调用Dispose。然而,这是我目前的理解,我可能是错的。同样到目前为止,我一直在我的脚本的开始和结束处使用启动和停止SPAssignment。我的目标是让脚本更高效。 – Ron 2014-10-19 09:46:01

+0

您提到PSObject不是像SharePoint对象那样“重”的对象,现在已经很有意义。但这是否意味着我们并不总是需要“处理”所有创建的对象?作为系统管理员,我对这些编程概念并不十分清楚。 – Ron 2014-10-19 10:02:29

+0

@Ron powershell在运行空间关闭时自动删除所有创建的对象 – Paul 2014-10-20 19:17:48