我有以下PowerShell脚本在使用System.outOfMemoryException执行30分钟后失败
$csv = get-content "C:\test\groups.txt"
$result = $csv | foreach-object {
$group=$_
get-QADGroupMember "$_" -PageSize 500 -sizelimit 0 |
select-object sAMAccountName,@{n="GroupName";e={$group}},type
}
$result | export-csv C:\test\groupMembers.csv -Delimiter "|" -notypeinformation
脚本的作用是从文本文件groups.txt
获取内容,该文件是Active Directory中找到的所有组的列表,然后对于每个组,它在csv中提取组名,成员名称和会员类型。
如果我没有错,脚本会将太多数据处理到内存中并在达到限制时失败,是否有办法调整脚本,例如每次进行一组操作时释放内存? / p>
答案 0 :(得分:1)
我的组织不足以让我遇到这类问题,但您应考虑的一些初步建议是删除$result
变量,因为这会保存所有进度写入文件之前的内存。
$csv = get-content "C:\test\groups.txt"
$csv | foreach-object {
$group=$_
get-QADGroupMember "$_" -PageSize 500 -sizelimit 0 |
select-object sAMAccountName,@{n="GroupName";e={$group}},type
} | export-csv C:\test\groupMembers.csv -Delimiter "|" -notypeinformation
要继续,假设您至少拥有PowerShell 3.0,您可以使用-ReadCount
,它将一次拉出多行,而不是一次拉一行。不是100%确定它是否会对你的情况有所帮助
get-content "C:\test\groups.txt" -ReadCount 500 | foreach-object {
$group=$_
get-QADGroupMember "$_" -PageSize 500 -sizelimit 0 |
select-object sAMAccountName,@{n="GroupName";e={$group}},type
} | export-csv C:\test\groupMembers.csv -Delimiter "|" -notypeinformation
答案 1 :(得分:1)
您还可以尝试使用流而不是get-content来读取该文件,以将内存使用量降至最低。
这样的事情:
$file = New-Object System.IO.StreamReader -Arg "c:\test\groups.txt"
$outstream = [System.IO.StreamWriter] "c:\test\groupMembers.csv"
while ($line = $file.ReadLine()) {
# $line has your line, parse to get each piece of csv
#create a csv string and stream it to the output file
$s = "`"{0}`",`"{1}`",`"{2}`",`"{3}`"" -f ($each,$piece,$of,$csv)
$outstream.WriteLine($s)
}
$file.close()
$outstream.close()