2013-04-23 56 views
0

我正在运行MySQL Query来更新MS AD并将错误输出到txt文件。代码工作正常,但几分钟后我得到错误'System.OutOfMemoryException'。PowerShell - Get-QADUser ='System.OutOfMemoryException'

下面是一段代码。

Function Addmembers { 

$query = "SELECT * FROM allstudents_groups" 
$dtResult = New-Object "System.Data.DataTable" 

$hashOptions = @{ } 
$hashOptions["strServer"] = "servername" 
$hashOptions["strDatabase"] = "DB" 
$hashOptions["strUser"] = "user" 
$hashOptions["strPassword"] = "pass" 
$hashOptions["strQuery"] = $query 
$dtResult = executeMYSQLQuery($hashOptions) 
$OU = "OU=Class Group,DC=company,DC=internal" 

ForEach ($row in $dtResult){ 
    $result = $row.GroupName 
    $resmember = $row.Members 
    $out_file = "C:\Scripts\Users.txt" 
    $studentOU = "OU=Users,OU=CHS,OU=Est,DC=Company,DC=internal" 
    $resmember | %{$_.Split(',')} | %{ 
     If(Get-QADUser -PageSize 1000 -DontUseDefaultIncludedProperties -SizeLimit 0 -SearchRoot "$studentOU" -LdapFilter "(name=$_)") 
     {Add-ADGroupMember -Identity $result -Members "$($_)" 
     [System.GC]::Collect() 
    } 

Else 
    {"$_" | out-file "$out_file" -append} 
}} 
[System.GC]::Collect() 
} 
$dtResult = $Null 
} 
Addmembers  

我相信这是由于代码获取所有数据库的东西,并试图将其保存在内存中。我认为ForEach-Object会阻止内存填满,但似乎并不支持逻辑。我也尝试在IF语句中添加一个[System.GC] :: Collect(),但它没有做任何事情来阻止内存不断向上爬

+0

如果你直接管它,会发生什么情况$ dtResult = New-Object“System.Data.DataTable” foreach? – 2013-04-23 16:21:48

回答

0

感谢您的回复。

把一个回车和一个输出行似乎处理工作好得多,并完成整个数据库表。

 If(Get-QADUser -PageSize 1000 -DontUseDefaultIncludedProperties -SizeLimit 0 -SearchRoot "$CLVOU" -LdapFilter "(name=$resteach)") 
     { 
     Write-Output "$resteach is being added to $result" 
     Add-ADGroupMember -Identity $result -Members "$resteach" 
     [System.GC]::Collect() 
     } 
0

它看起来像你存储你的全部结果在这个变量设置:$dtResult

因此,假设它是一个大的记录,它可以很容易消耗掉所有你的记忆。你可以尝试下面的东西。 Foreach-Object会在管道进入时将每个对象向下传送,而不是试图将其全部保存在内存中,然后迭代它。

executeMYSQLQuery($hashOptions) | Foreach-Object { 
    $result = $_.GroupName 
    $resmember = $_.Members 

    #etc... 


} 
相关问题