如下面的代碼所示,我最終爲網站集中的每個網站創建了一個新的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
'GET-SPSite'返回單個'Microsoft.SharePoint.SPSite'對象的集合。 '$ SPWebApp.Sites'返回'Microsoft.SharePoint.Administration.SPSiteCollection',我認爲它不像前者那樣佔用內存。 foreach循環只創建一個SPSite對象,該對象用於獲取集合中每個SPSite的屬性。這就是爲什麼我在foreach循環外調用Dispose。然而,這是我目前的理解,我可能是錯的。同樣到目前爲止,我一直在我的腳本的開始和結束處使用啓動和停止SPAssignment。我的目標是讓腳本更高效。 – Ron 2014-10-19 09:46:01
您提到PSObject不是像SharePoint對象那樣「重」的對象,現在已經很有意義。但這是否意味着我們並不總是需要「處理」所有創建的對象?作爲系統管理員,我對這些編程概念並不十分清楚。 – Ron 2014-10-19 10:02:29
@Ron powershell在運行空間關閉時自動刪除所有創建的對象 – Paul 2014-10-20 19:17:48