我正在运行MySQL查询以更新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爬行
答案 0 :(得分: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()
}
答案 1 :(得分:0)
看起来您将整个结果集存储在此变量中:$dtResult
因此,假设它是一个大型记录集,它可以轻松消耗所有内存。您可以尝试类似下面的内容。 Foreach-Object会在每个对象进入时将其发送到管道中,而不是尝试将其全部保存在内存中,然后迭代它。
executeMYSQLQuery($hashOptions) | Foreach-Object {
$result = $_.GroupName
$resmember = $_.Members
#etc...
}