如下面的代码所示,我最终为网站集中的每个网站创建了一个新的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
'GET-SPSite'返回单个'Microsoft.SharePoint.SPSite'对象的集合。 '$ SPWebApp.Sites'返回'Microsoft.SharePoint.Administration.SPSiteCollection',我认为它不像前者那样占用内存。 foreach循环只创建一个SPSite对象,该对象用于获取集合中每个SPSite的属性。这就是为什么我在foreach循环外调用Dispose。然而,这是我目前的理解,我可能是错的。同样到目前为止,我一直在我的脚本的开始和结束处使用启动和停止SPAssignment。我的目标是让脚本更高效。 – Ron 2014-10-19 09:46:01
您提到PSObject不是像SharePoint对象那样“重”的对象,现在已经很有意义。但这是否意味着我们并不总是需要“处理”所有创建的对象?作为系统管理员,我对这些编程概念并不十分清楚。 – Ron 2014-10-19 10:02:29
@Ron powershell在运行空间关闭时自动删除所有创建的对象 – Paul 2014-10-20 19:17:48