2012-08-08 204 views
1

我有一個內存問題,我需要關於powershell的幫助。對於以下代碼:內存不足

function Get-PathPermissions { 
     param ([Parameter(Mandatory=$true)] [System.String]${Path}) 
process { 
    $groups=$null 
    [email protected]{} 
    $containers = Get-ChildItem -path $Path -recurse | ? {$_.psIscontainer -eq $true} 
    if ($containers -eq $null) {break} 
    foreach ($container in $containers) { 
     Write-Output "Container: " $container 
     $accts = (Get-ACL $container.fullname).Access 
     foreach($acct in $accts) { 
      $acctsQADObject = Get-QADObject -Identity ([string]$acct.IdentityReference) 
      if ($acctsQADObject.ObjectClass -contains 'group') { 
       $Name = $acctsQADObject.Name 
       $DN = $acctsQADObject.DN 

       if (!$groups.ContainsKey($Name)) { 
        Write-Output "Adding $($Name) and $($DN)" 
        $groups.add($($Name),$($DN)) 
       } 

      } 
     } 
    } 
    foreach ($key in $groups.GetEnumerator() | Sort-Object Name -descending) { 
     dumpGroup($key.value) 
    } 
}     
} 

對於每個$accts循環,我的記憶會增加。例如,我從1.41 GB開始,它只是繼續攀升1.42,1.43 ... 3.00GB +。這不是對組哈希的添加,因爲只有兩組可以進行測試。每次需要設置$accts = $null嗎?我認爲每個循環都會造成$accts以上,摧毀他之前的一個。

+0

任何解決方案嗎? – Kiquenet 2012-08-09 12:17:49

回答

0

您可以嘗試在處理每個文件後調用垃圾回收。

+0

太好了。你是怎樣做的? – archcutbank 2012-08-16 13:54:43

+0

我發現這一點,並在$ accts循環中試過:if(($ counter%200)-eq 0){Write-Output「Running garbage collection」; [System.GC] :: Collect()}但即使我看到它宣佈它正在運行垃圾收集,內存仍然在攀升。 – archcutbank 2012-08-16 14:03:09

+1

我放棄了試圖使用Quest或2008 R2 ActiveDirectory cmdlet,而是使用adsisearcher,它與內存相比非常快速且非常好。 – archcutbank 2012-08-17 19:37:59