2017-10-25 8 views
0

Ich habe ein PS-Skript auf einem Domänencontroller (SRV2012R2) erstellt.Get-ChildItem in einem riesigen Verzeichnis und RAM-Nutzung

Das Skript prüft jeden freigegebenen Ordner (Netzlaufwerk), um zu sehen, ob es irgendwelche Dateien präsentieren größer als 2 GB:

foreach($dir in $Dirs) 
{ 
    $files = Get-ChildItem $dir -Recurse 

    foreach ($item in $files) 
    { 

     #Check if $item.Size is greater than 2GB 

    } 
} 

Ich habe folgendes Problem:

Die Aktien mit über ziemlich gefüllt sind 800 GB (Sub-) Ordner, Dateien und die meisten davon sind nur normale Dokumente.

Immer wenn ich mein Skript ausführe, sehe ich, dass die CPU + RAM enorme Mengen verbraucht, während ich mein Skript ausführe (nach 5 Minuten in der Get-Childitem-Zeile hat der RAM bereits> 4GB erreicht).

Meine Frage ist, warum benötigt Get-ChildItem so viele Ressourcen? Welche Alternative kann ich verwenden? Weil ich es nicht geschafft habe, mein Skript erfolgreich auszuführen.

Ich habe gesehen, dass ich | SELECT fullname, length nach meiner Get-ChildItem -Klausel als eine Verbesserung verwenden kann, aber das hat mir überhaupt nicht geholfen (Abfrage verbraucht immer noch enormen RAM).

Gibt es etwas, was ich tun kann, damit ich die Verzeichnisse ohne großen Widerstand von den Maschinenressourcen durchlaufen kann?

+0

Was ist Ihr Endziel? Sie können dies auch in einer einzigen Zeile erreichen: '$ Files = Get-ChildItem -Recurse | Where-Object {$ PSItem.Length -gt 2GB} ' – TheIncorrigible1

Antwort

0

Anstatt jede einzelne Datei auf eine Variable zu speichern, verwenden Sie die Pipeline diejenigen herausgefiltert werden Sie nicht brauchen (dh diejenigen, die kleiner als 2 GB.):

foreach($dir in $Dirs) 
{ 
    $bigFiles = Get-ChildItem $dir -Recurse |Where Length -gt 2GB 
} 

Wenn Sie verarbeiten oder analysieren müssen diese großen Dateien weiter, würde ich vorschlagen, dass Sie diese Pipeline mit ForEach-Object erweitern:

foreach($dir in $Dirs) 
{ 
    Get-ChildItem $dir -Recurse |Where Length -gt 2GB |ForEach-Object { 
     # do whatever else you must 
     # $_ contains the current file 
    } 
} 
+0

Danke für Ihre Antwort. Aber wie könnte ich $ bigFiles danach durchlaufen? Wie kann ich die Menge von $ bigFiles überprüfen? – user3127554

+0

@ user3127554 '$ bigFiles.Count' – TheIncorrigible1

+0

Entweder verwenden Sie Ihren aktuellen Ansatz oder Tag' ForEach-Object' am Ende der Pipeline –

0

starten:

# Create an Array 
$BigFilesArray = @() 

#Populate it with your data 
$BigFilesArray = @(ForEach-Object($dir in $dirs) {Get-ChildItem $dir -Recurse | Where-Object Length -GT 2GB}) 

#Number of items in the array 
$BigFilesArray.Count 

#Looping to get the name and size of each item in the array 
ForEach-Object ($bf in $BigFilesArray) {"$($bf.name) - $($bf.length)"} 

Hoffe, das hilft!

+0

vielen Dank für die Alternative – user3127554

Verwandte Themen