Tags: PowerShell, Datei-Management
Wenn man wissen möchte, welchen Umfang die Dateien in einem bestimmten Verzeichnis insgesamt haben, dann kann man dies relativ leicht im Explorer herausfinden. Benötigt man aber ein differenziertes Ergebnis, das beispielsweise einzelne Dateitypen zählt oder ausschließt, dann erweist sich PowerShell als das bessere Tool.
Auf der Eingabeaufforderung ließ sich die Größe von Verzeichnissen auch schon in der Vergangenheit ermitteln, etwa mit einem Befehl wie
dir Downloads | find "Datei(en)"
Sobald man jedoch die Dateigrößen in Verzeichnisbäumen auflisten möchte, reichen diese Mittel nicht mehr aus und man braucht Tools wie disk usage (du) von SysInternals.
In PowerShell läuft die Berechnung von Datei- und Verzeichnisgrößen meistens auf eine Kombination von Get-ChildItem (Alias gci) und Measure-Object (Alias measure) hinaus. Ersteres liefert die Dateilisten nach verschiedenen Filterkriterien und Zweiteres erledigt die Rechenarbeit. Obiges Beispiel für cmd.exe würde unter PowerShell dann so aussehen:
gci Downloads | measure -Property Length -sum
Measure-Object muss man über den Parameter Property mitteilen, welches Attribut es für die Kalkulation verwenden soll. Hier ist es Length, das in einem Objekt vom Typ System.IO.FileInfo die Dateilänge enthält. Der Name des Parameters kann bei einer Kurzschreibweise entfallen:
gci Downloads | measure Length -s
Wie man an der Ausgabe schnell erkennt, gibt die Eigenschaft Count die Zahl der Dateien wider, die aufsummierten Dateiumfänge zeigen sich als große Zahl ohne Maßeinheit unter Sum. Augenscheinlich handelt es sich dabei um Bytes, die man im Normalfall in MB oder GB umrechnen wird:
(gci Downloads | measure Length -s).Sum /1GB
Das Ergebnis wird nun ziemlich viele Nachkommastellen aufweisen. Um diese auf 2 zu reduzieren, kann man den Formatoperator einsetzen:
"{0:N2} GB" -f ((gci Downloads | measure Length -s).Sum /1GB)
Natürlich lässt sich ein solcher Aufruf durch Filter so eingrenzen, dass er nur bestimmte Dateitypen berücksichtigt:
(gci Downloads *.iso | measure Length -s).Sum /1GB
Mit diesem Kommando würde man erfahren, wie viel Platz die ISO-Dateien im Ordner Downloads beanspruchen.
Interessanter wird es, wenn man die Größe aller Unterverzeichnisse ermitteln möchte:
gci -Dir -r | %{$_.FullName; ((gci -File $_.FullName |
measure Length -Sum).Sum) /1MB }
Hier würde der erste Befehl die Namen aller Ordner unterhalb des aktuellen Verzeichnisses sammeln und an die Schleife (Alias "%") weiterleiten. Sie gibt zuerst den Verzeichnisnamen aus und ruft dann erneut Get-ChildItem mit dem Parameter File auf, um den Inhalt des jeweiligen Verzeichnisses an Measure-Object zu übertragen.
Um nur leere Unterverzeichnisse zu finden, muss man Measure-Object übrigens nicht bemühen. Hier kann man einfach das Ergebnis der Methode GetFiles() auswerten:
gci -Dir -r | %{ if($_.GetFiles().Length -eq "0") {$_.FullName}}
Neben der Summe berechnet Measure-Object auch andere Werte, nämlich den Durchschnitt, das Minimum und das Maximum:
gci -File | Measure-Object Length -Max -Min -Sum -Average
Im Zusammenhang mit Dateigrößen sind diese Angaben jedoch von begrenztem Nutzen. So zeigt Measure-Object beispielsweise nicht an, wie die größte oder kleinste Datei heißt. Wenn man etwa die größten Speicherfresser finden möchte, dann muss man dafür auf Sort-Object zurückgreifen.
Täglich Know-how für IT-Pros mit unserem Newsletter
Verwandte Beiträge
Weitere Links