如何处置PSObject

时间:2014-10-19 07:49:36

标签: sharepoint-2010 powershell-v2.0 powershell-v3.0

如下面的代码所示,我最终为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

1 个答案:

答案 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