PS-Skript, um Ordnergröße festzustellen
Moin Kollegen.
Treesize ist ein schönes Tool und in der Pro-Version kann ich damit Ordnergrößen auch geskriptet auslesen.
Ich dachte mir, so schwer kann es nicht sein, Ordnergrößen mit Powershell festzustellen und las http://woshub.com/powershell-get-folder-sizes/
Leider sind die dortigen Skripte nicht in der Lage, auf einem aktuellen Win10 20H2 korrekt die Größe von Benutzerprofilen darzustellen, während Treesize das schafft.
Die Ergebnisse liegen meilenweit auseinander. Rechtsklick auf den Ordner - Eigenschaften bestätigt das Ergebnis von Treesize.
Verwendetes Skript:
Wer kann das besser? Wenn Ihr testen wollt, nehmt bitte c:\users und startet das Skript als Systemkonto mittels psexec.
[nein, es besteht kein Zweifel daran, dass das Ergebnis der dortigen Skripte falsch ist. Auch die Datenträger-Gesamtbelegung wird weit übertroffen, wenn man c: scannt]
Treesize ist ein schönes Tool und in der Pro-Version kann ich damit Ordnergrößen auch geskriptet auslesen.
Ich dachte mir, so schwer kann es nicht sein, Ordnergrößen mit Powershell festzustellen und las http://woshub.com/powershell-get-folder-sizes/
Leider sind die dortigen Skripte nicht in der Lage, auf einem aktuellen Win10 20H2 korrekt die Größe von Benutzerprofilen darzustellen, während Treesize das schafft.
Die Ergebnisse liegen meilenweit auseinander. Rechtsklick auf den Ordner - Eigenschaften bestätigt das Ergebnis von Treesize.
Verwendetes Skript:
"{0:N2} GB" -f ((gci -force c:\users\ -Recurse -ErrorAction SilentlyContinue | Where-Object { $_.LinkType -notmatch "HardLink" }| measure Length -s).sum / 1Gb)
Wer kann das besser? Wenn Ihr testen wollt, nehmt bitte c:\users und startet das Skript als Systemkonto mittels psexec.
[nein, es besteht kein Zweifel daran, dass das Ergebnis der dortigen Skripte falsch ist. Auch die Datenträger-Gesamtbelegung wird weit übertroffen, wenn man c: scannt]
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 1497941480
Url: https://administrator.de/forum/ps-skript-um-ordnergroesse-festzustellen-1497941480.html
Ausgedruckt am: 02.04.2025 um 22:04 Uhr
12 Kommentare
Neuester Kommentar

Ohne den -Force Parameter bei Get-ChildItem werden versteckte Dateien nicht inkludiert.
Und bei Tests im Zweifel -ErrorAction SilentlyContinue weglassen dann sieht man auch wo es evt. Fehler beim Zugriff gibt und damit das Ergebnis nicht mehr stimmt.
Und bei Tests im Zweifel -ErrorAction SilentlyContinue weglassen dann sieht man auch wo es evt. Fehler beim Zugriff gibt und damit das Ergebnis nicht mehr stimmt.

Uuups übersehen, da es am Anfang steht, sorry.
Zitat von @Lochkartenstanzer:
Kann es sein, daß das Skript junctions/hardlinks falsch behandelt und da ggf vieles mehrfach zählt?
Das würde ich auch spontan vermuten.Kann es sein, daß das Skript junctions/hardlinks falsch behandelt und da ggf vieles mehrfach zählt?
Moin,
Wenn man bei Get-ChildItem mit -Recurse arbeitet, werden durch Where-Object nur die Objekte übersprungen, die tatsächlich die entsprechenden Eigenschaften besitzen - nicht jedoch Elemente, die darunter liegen.
Gruß Thomas
Wenn man bei Get-ChildItem mit -Recurse arbeitet, werden durch Where-Object nur die Objekte übersprungen, die tatsächlich die entsprechenden Eigenschaften besitzen - nicht jedoch Elemente, die darunter liegen.
Zitat von @DerWoWusste:
Wer kann das besser? Wenn Ihr testen wollt, nehmt bitte c:\users und startet das Skript als Systemkonto mittels psexec.
Ich würde da mit einer eigenen rekursiven Funktion arbeiten.Wer kann das besser? Wenn Ihr testen wollt, nehmt bitte c:\users und startet das Skript als Systemkonto mittels psexec.
Function Measure-Recursive {
Param([io.DirectoryInfo]$Path)
$Size = Foreach ($Dir in Get-ChildItem -EA si -Attributes !ReparsePoint -Dir -Force $Path.FullName) {Measure-Recursive $Dir}
$Size += (Get-ChildItem -EA SI -File $Path.Fullname -Force | Measure -Sum -Property Length).Sum
Return ($Size | Measure -Sum).Sum
}
"{0:N2} GiB" -f ((Measure-Recursive $HOME)/1GB)
Gruß Thomas
Zitat von @emeriks:
Zitat von @Lochkartenstanzer:
Kann es sein, daß das Skript junctions/hardlinks falsch behandelt und da ggf vieles mehrfach zählt?
Das würde ich auch spontan vermuten.Kann es sein, daß das Skript junctions/hardlinks falsch behandelt und da ggf vieles mehrfach zählt?
Das passiert nämlich auch, wenn man mit du (wsl oder offline mit knoppix &co.) "nachzählen" will.
lks
Zitat von @DerWoWusste:
Und Zugriffsfehler dürften nicht auftreten, da Treesize ja mit den selben Rechten gestartet wird, wie das Skript
Jain.Und Zugriffsfehler dürften nicht auftreten, da Treesize ja mit den selben Rechten gestartet wird, wie das Skript
Voll eleviert ausführen bedeutet nicht automatisch, dass alle Privilegien aktiviert sind. So muss man z.B. die Privilegien eines "Backup-Operator" erst explizit für einen Prozess aktivieren, damit dieser auch Daten lesen kann, für welche der ausführende Benutzer regulär keine Rechte hat.
Ich schätze, Treesize wird das für seinen Prozess so machen, wenn möglich. Möglich nur, wenn voll eleviert gestartet.
Du müsstest das also in Deinem PS-Script auch erst explizit aktivieren.
z.B. hier beschrieben: ADJUSTING TOKEN PRIVILEGES IN POWERSHELL

Zitat von @DerWoWusste:
Das was treesize macht, scheint entweder nicht auf PS zu basieren, oder noch eleganter zu sein, denn es läuft deutlich schneller, aber das macht nichts, so lange es zum selben Ergebnis kommt.
TreeSize macht das über das Auslesen der Daten aus der MFT.Das was treesize macht, scheint entweder nicht auf PS zu basieren, oder noch eleganter zu sein, denn es läuft deutlich schneller, aber das macht nichts, so lange es zum selben Ergebnis kommt.
Zitat von @149569:
TreeSize macht das über das Auslesen der Daten aus der MFT.
Etwas anderes macht PS auch nicht. Es zählt nicht die Bytes. TreeSize macht das über das Auslesen der Daten aus der MFT.
Treesize wird einfach in mehreren Threads laufen. Ich habe sowas auch schon in .Net geschrieben. Das geht dann ratzfatz, jedoch immer abhängig von der Anzahl der Dateien und Ordner. Je mehr, desto länger dauert das Zählen.
Man kann sowas sicherlich auch mit PS machen. Es wird trotzdem nicht ganz so schnell sein wie Treesize, aber immer noch schneller als im Single Thread.