0

我有以下 PowerShell 脚本在执行 30 分钟后失败并出现 System.outOfMemoryException

$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 中提取组名称、成员名称和成员类型。

如果我没记错的话,脚本正在将太多数据处理到内存中并在达到限制时失败,有没有办法调整脚本,例如在每次进行组时释放内存或其他什么?

4

2 回答 2

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()
于 2015-02-02T15:54:48.213 回答
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,您可以使用-ReadCountwhich 将一次拉出多行而不是一次拉出一行。不是 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
于 2015-02-02T15:00:25.630 回答