Sharepoint 2010 如何处理PSObject
如下面的代码所示,我最终为sites集合中的每个站点创建了一个新的PSObject。最终,我需要为多个SharePoint web应用程序运行此功能,每个应用程序包含多个站点,总站点数超过2000个。这就是很多PSObject被创建的原因 PSObject没有dispose函数,因此我可以选择哪些选项来提高代码的效率和dispose对象 此外,每次执行操作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时,都会重新分配内存,因为它是一个动态扩展数组。根据我几个月前读到的一篇文章,任何内存
$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在运行空间关闭时删除了对象,并不意味着不需要进行处理。如果您有一个可以处理很多对象的脚本,那么您可能仍然会发现,处理它以避免占用内存是明智的。