如下面的代码所示,我最终为sites集合中的每个站点创建了一个新的PSObject。最终,我需要为多个SharePoint Web应用程序运行此应用程序,每个应用程序包含多个站点,总站点数超过2000.因此,正在创建大量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 :(得分:0)
这个对象将在需要时进行垃圾回收。它不是一个包含COM&的重型SharePoint对象。数据库连接及其不需要处理。
你希望处理$ site,以便放入foreach循环中。
对于大多数SharePoint PowerShell命令,您可以使用-AssignmentCollections
而不是手动处理:
管理物品以便妥善处置。使用对象(如SPWeb或SPSite)可能会占用大量内存,并且在Windows PowerShell脚本中使用这些对象需要正确的内存管理。使用SPAssignment对象,您可以将对象分配给变量,并在需要释放内存后处置这些对象。使用SPWeb,SPSite或SPSiteAdministration对象时,如果未使用赋值集合或Global参数,则会自动处理对象。
获得相同功能的更多PowerShell方法是
$gc = Start-SPAssignment
Get-SPSite "http://portal.contoso.com" -Limit All -AssignmentCollection $gc | % {
# Loop
}
Stop-SPAssignment -Identity $gc