derwowusste
Goto Top

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:
"{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]

Content-Key: 1497941480

Url: https://administrator.de/contentid/1497941480

Printed on: April 19, 2024 at 21:04 o'clock

Mitglied: 149569
149569 Nov 12, 2021 updated at 08:33:24 (UTC)
Goto Top
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.
Member: DerWoWusste
DerWoWusste Nov 12, 2021 updated at 08:33:38 (UTC)
Goto Top
Hi hacktor.

Der Parameter -Force wird bereits verwendet.
Und Zugriffsfehler dürften nicht auftreten, da Treesize ja mit den selben Rechten gestartet wird, wie das Skript und eine geringere (aber korrekte) Größe anzeigt
Mitglied: 149569
149569 Nov 12, 2021 updated at 08:35:07 (UTC)
Goto Top
Zitat von @DerWoWusste:
Der Parameter -Force wird bereits verwendet.
Uuups übersehen, da es am Anfang steht, sorry.
Member: Lochkartenstanzer
Lochkartenstanzer Nov 12, 2021 at 09:03:18 (UTC)
Goto Top
Moin,

Ohne das jetzt ausprobiert zu haben (Bin gerade afk):

Kann es sein, daß das Skript junctions/hardlinks falsch behandelt und da ggf vieles mehrfach zählt?

lks
Member: emeriks
emeriks Nov 12, 2021 at 09:11:47 (UTC)
Goto Top
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.
Member: TK1987
Solution TK1987 Nov 12, 2021 updated at 09:41:27 (UTC)
Goto Top
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.

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.
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
Member: Lochkartenstanzer
Lochkartenstanzer Nov 12, 2021 updated at 09:15:36 (UTC)
Goto Top
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.

Das passiert nämlich auch, wenn man mit du (wsl oder offline mit knoppix &co.) "nachzählen" will.

lks
Member: emeriks
emeriks Nov 12, 2021 at 09:16:53 (UTC)
Goto Top
Zitat von @DerWoWusste:
Und Zugriffsfehler dürften nicht auftreten, da Treesize ja mit den selben Rechten gestartet wird, wie das Skript
Jain.
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
Member: DerWoWusste
DerWoWusste Nov 12, 2021 updated at 09:48:04 (UTC)
Goto Top
@TK1987
Oho, das Skript bring das Selbe raus, was Treesize misst!
👍
Member: DerWoWusste
DerWoWusste Nov 12, 2021 at 11:40:37 (UTC)
Goto Top
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.

Vielen Dank, Thomas!
Mitglied: 149569
149569 Nov 15, 2021 updated at 16:12:18 (UTC)
Goto Top
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.
Member: emeriks
emeriks Nov 16, 2021 at 09:03:11 (UTC)
Goto Top
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. face-wink

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.