Measure-Object: Größe von Verzeichnissen und Dateien berechnen in PowerShell

    Kostenloser Guide für Windows Sysinternals: Praktische Tipps zu Process Explorer, Autoruns, RAMMap, VMMap und Process Monitor. Download »

    (Anzeige)

    Windows-Ordner freigebenWenn man wissen möchte, welchen Umfang die Dateien in einem bestimm­ten Ver­zeichnis insge­samt haben, dann kann man dies rela­tiv leicht im Explorer heraus­finden. Benötigt man aber ein differen­ziertes Ergebnis, das beispiels­weise einzelne Datei­typen zählt oder aus­schließt, dann erweist sich PowerShell als das bessere Tool.

    Auf der Eingabe­aufforderung ließ sich die Größe von Verzeich­nissen auch schon in der Vergangen­heit ermitteln, etwa mit einem Befehl wie

    dir Downloads | find "Datei(en)"

    Sobald man jedoch die Dateigrößen in Verzeichnis­bä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 Verzeichnis­größen meistens auf eine Kombination von Get-ChildItem (Alias gci) und Measure-Object (Alias measure) hinaus. Ersteres liefert die Dateilisten nach verschiedenen Filter­kriterien und Zweiteres erledigt die Rechenarbeit. Obiges Beispiel für cmd.exe würde unter PowerShell dann so aussehen:

    gci Downloads | measure -Property Length -sum

    Kumulierte Dateigrößen ausgeben mit Measure-Object

    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 Kurz­schreibweise entfallen:

    gci Downloads | measure Length -s

    Wie man an der Ausgabe schnell erkennt, gibt die Eigenschaft Count die Zahl der Dateien wider, die auf­summierten Dateiumfänge zeigen sich als große Zahl ohne Maßeinheit unter Sum. Augen­scheinlich 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 Nach­kommastellen aufweisen. Um diese auf 2 zu reduzieren, kann man den Formatoperator einsetzen:

    "{0:N2} GB" -f ((gci Downloads | measure Length -s).Sum /1GB)

    Dateigrößen in GB konvertieren und mit dem Formatoperator aufbereiten

    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 Unter­verzeichnisse ermitteln möchte:

    gci -Dir -r | %{$_.FullName; ((gci -File $_.FullName |
    measure Length -Sum).Sum) /1MB }

    Größe von Unterverzeichnissen berechnen mit gci und measure

    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 Verzeichnis­namen 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 Unter­verzeichnisse 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 Durch­schnitt, das Minimum und das Maximum:

    gci -File | Measure-Object Length -Max -Min -Sum -Average

    Im Zusammen­hang 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.

    Keine Kommentare