Sharepoint 2010 如何处理PSObject

Sharepoint 2010 如何处理PSObject,sharepoint-2010,powershell-2.0,powershell-3.0,Sharepoint 2010,Powershell 2.0,Powershell 3.0,如下面的代码所示,我最终为sites集合中的每个站点创建了一个新的PSObject。最终,我需要为多个SharePoint web应用程序运行此功能,每个应用程序包含多个站点,总站点数超过2000个。这就是很多PSObject被创建的原因 PSObject没有dispose函数,因此我可以选择哪些选项来提高代码的效率和dispose对象 此外,每次执行操作$SiteInfoCollection+=$object时,都会重新分配内存,因为它是一个动态扩展数组。根据我几个月前读到的一篇文章,任何内存

如下面的代码所示,我最终为sites集合中的每个站点创建了一个新的PSObject。最终,我需要为多个SharePoint web应用程序运行此功能,每个应用程序包含多个站点,总站点数超过2000个。这就是很多PSObject被创建的原因

PSObject没有dispose函数,因此我可以选择哪些选项来提高代码的效率和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

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

希望处置$site,因此将其放入foreach循环中

对于大多数SharePoint PowerShell命令,您可以使用
-AssignmentCollections
而不是手动处理:

管理对象以便正确处置。使用对象(如SPWeb或SPSite)会占用大量内存,在Windows PowerShell脚本中使用这些对象需要进行适当的内存管理。使用SPAssignment对象,可以将对象指定给变量,并在需要释放内存后处理这些对象。使用SPWeb、SPSite或SPSiteAdministration对象时,如果未使用赋值集合或全局参数,则会自动处理这些对象

要获得同样的功能,一个更强大的方法是

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

Get SPSite
返回单个
Microsoft.SharePoint.SPSite
对象的集合
$SPWebApp.Sites
返回
Microsoft.SharePoint.Administration.SPSiteCollection
,我认为它不像前者那样占用内存。foreach循环只创建1个SPSite对象,用于获取集合中每个SPSite的属性。这就是为什么我在foreach循环之外调用Dispose。然而,这是我目前的理解,我可能是错的。到目前为止,我还在脚本的开头和结尾使用Start和Stop-SPAssignment。我的目标是提高我的脚本的效率。您提到PSObject不像SharePoint对象那样是一个“沉重”的对象,这在现在是有意义的。但这是否意味着我们并不总是需要“处置”所有创建的对象?作为一名系统管理员,我对这些编程概念不是很清楚。@Ron powershell会在运行空间关闭后自动删除所有创建的对象closed@Paul仅仅因为PowerShell在运行空间关闭时删除了对象,并不意味着不需要进行处理。如果您有一个可以处理很多对象的脚本,那么您可能仍然会发现,处理它以避免占用内存是明智的。