2014-10-19 61 views
0

如下面的代碼所示,我最終爲網站集中的每個網站創建了一個新的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 

回答

0

該對象在進行此操作時將被垃圾收集。它不是一個包含COM數據庫連接的重磅SharePoint對象,因此不需要處理。

想要把$ site放置在foreach循環中。

對於大多數的SharePoint PowerShell命令,你可以用-AssignmentCollections,而不是手動配置:

管理對象以便正確處置爲目的的。使用諸如SPWeb或SPSite等對象可以使用大量內存,並且在Windows PowerShell腳本中使用這些對象需要進行適當的內存管理。使用SPAssignment對象,您可以將對象分配給變量,並在需要釋放內存後處置這些對象。當使用SPWeb,SPSite或SPSiteAdministration對象時,如果未使用分配集合或Global參數,則會自動處理這些對象。

更PowerShell的方式來獲得同樣的functionallity將

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

'GET-SPSite'返回單個'Microsoft.SharePoint.SPSite'對象的集合。 '$ SPWebApp.Sites'返回'Microsoft.SharePoint.Administration.SPSiteCollection',我認爲它不像前者那樣佔用內存。 foreach循環只創建一個SPSite對象,該對象用於獲取集合中每個SPSite的屬性。這就是爲什麼我在foreach循環外調用Dispose。然而,這是我目前的理解,我可能是錯的。同樣到目前爲止,我一直在我的腳本的開始和結束處使用啓動和停止SPAssignment。我的目標是讓腳本更高效。 – Ron 2014-10-19 09:46:01

+0

您提到PSObject不是像SharePoint對象那樣「重」的對象,現在已經很有意義。但這是否意味着我們並不總是需要「處理」所有創建的對象?作爲系統管理員,我對這些編程概念並不十分清楚。 – Ron 2014-10-19 10:02:29

+0

@Ron powershell在運行空間關閉時自動刪除所有創建的對象 – Paul 2014-10-20 19:17:48