0

我正在运行 MySQL Query 来更新 MS AD 并将错误输出到 txt 文件。代码工作正常,但几分钟后我收到错误“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() 但这并不能阻止 RAM 爬升

4

2 回答 2

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()
        }
于 2013-04-25T07:44:01.760 回答
0

看起来您将整个结果集存储在此变量中:$dtResult

因此,假设它是一个大型记录集,它很容易消耗您的所有内存。您可以尝试以下类似的方法。Foreach-Object 将在每个对象进入时将其发送到管道中,而不是尝试将其全部保存在内存中然后对其进行迭代。

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

   #etc...


}
于 2014-04-27T00:27:06.217 回答