0

System.outOfMemoryException で 30 分の実行後に失敗する次の PowerShell スクリプトがあります。

$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

スクリプトは、Active Directory で見つかったすべてのグループのリストであるテキスト ファイルからコンテンツを取得し、groups.txtグループごとにグループ名、メンバー名、およびメンバー タイプを 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 があると仮定すると-ReadCount、一度に 1 行ずつではなく、一度に複数行をプルする を使用できます。ただし、それがあなたの状況に役立つかどうかは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 に答える