Microsoft

OneDrive-Speicherplatz mit PowerShell prüfen: Größe und echter Platz auf der SSD

KI-Generiertes Foto

Wer OneDrive mit Files On-Demand nutzt, kennt wahrscheinlich dieses kleine Rätsel: Im Explorer wird ein OneDrive-Ordner vielleicht mit mehreren hundert Gigabyte angezeigt – auf der lokalen SSD belegt er aber nur einen Bruchteil davon.

Das ist kein Fehler.

OneDrive unterscheidet zwischen der vollständigen Größe der Dateien und dem Speicherplatz, den diese Dateien tatsächlich auf dem lokalen Datenträger belegen.

Gerade auf verwalteten Rechnern oder bei der Fehlersuche finde ich diese Unterscheidung ziemlich interessant. Denn die Frage „Wie groß ist der OneDrive-Ordner?“ kann je nach Betrachtungsweise zwei völlig unterschiedliche Antworten haben.

Mit PowerShell lässt sich beides auslesen – allerdings braucht man für den tatsächlich belegten Speicherplatz etwas mehr als die üblichen PowerShell-Befehle.

OneDrive-Größe und belegter Speicher sind nicht dasselbe

Wenn man im Explorer mit der rechten Maustaste auf den OneDrive-Ordner klickt und die Eigenschaften öffnet, zeigt Windows zwei Werte an:

Größe

und

Größe auf Datenträger

Die beiden Angaben können bei OneDrive deutlich voneinander abweichen.

Die Größe beschreibt die vollständige Größe aller Dateien im OneDrive-Ordner.

Größe auf Datenträger zeigt dagegen, wie viel Platz diese Dateien tatsächlich auf der lokalen Festplatte oder SSD benötigen.

Gerade bei Files On-Demand kann der Unterschied gewaltig sein.

Warum OneDrive lokal viel weniger Speicher benötigt

OneDrive muss nicht jede Datei dauerhaft auf dem Rechner speichern.

Im Explorer erkennt man den jeweiligen Zustand unter anderem an den bekannten Symbolen.

Eine Datei mit einer blauen Wolke befindet sich nur in der Cloud. Sie ist im OneDrive-Verzeichnis sichtbar, belegt lokal aber praktisch keinen entsprechenden vollständigen Dateispeicher.

Eine Datei mit einem grünen Haken wurde bereits auf den Rechner heruntergeladen und liegt damit auch lokal vor.

Dadurch kann beispielsweise ein OneDrive-Verzeichnis logisch sehr groß sein, während auf der SSD tatsächlich wesentlich weniger Speicher verwendet wird.

Und genau deshalb ist die reine Ordnergröße für eine Speicheranalyse nur bedingt hilfreich.

Warum PowerShell die Sache nicht direkt löst

Die vollständige Größe eines Verzeichnisses lässt sich mit PowerShell relativ einfach berechnen.

Beim tatsächlich auf dem Datenträger belegten Platz wird es dagegen schwieriger.

Standardmäßig bekommt man über die üblichen Dateieigenschaften die logische Dateigröße, aber nicht unbedingt den Wert, den Windows im Explorer als „Größe auf Datenträger“ ausweist.

Für eine normale lokale Datei fällt dieser Unterschied häufig kaum auf.

Bei OneDrive und Files On-Demand ist er dagegen entscheidend.

GetCompressedFileSizeW liefert den tatsächlichen Wert

Die vorgestellte Lösung verwendet deshalb die Windows-Funktion:

GetCompressedFileSizeW

Damit lässt sich ermitteln, wie viel Speicherplatz eine Datei tatsächlich auf dem Datenträger belegt.

Das ist interessant, weil die Funktion nicht nur bei OneDrive-Dateien hilfreich sein kann. Auch bei komprimierten oder anderweitig speziell gespeicherten Dateien können logische Größe und tatsächlicher Platzbedarf voneinander abweichen.

Das PowerShell-Skript greift dafür über .NET auf die entsprechende Windows-Funktion zu.

PowerShell trifft auf .NET und Win32

Für die Umsetzung werden verschiedene .NET-Bereiche verwendet, darunter:

  • System
  • System.Runtime.InteropServices
  • System.ComponentModel
  • System.IO

Über P/Invoke kann PowerShell beziehungsweise .NET eine native Windows-Funktion aufrufen.

In diesem Fall wird damit GetCompressedFileSizeW genutzt.

Das klingt zunächst etwas komplizierter als ein normales:

Get-ChildItem

hat aber einen guten Grund.

PowerShell kann damit Informationen abfragen, die über die normalen Dateiobjekte nicht ohne Weiteres zur Verfügung stehen.

Das fertige Skript übernimmt die Arbeit

Man muss das Ganze zum Glück nicht selbst von Grund auf programmieren.

Damien Van Robaeys stellt dafür ein fertiges PowerShell-Skript bereit:

Get_OD_SizeOnDisk.ps1

Das Skript durchsucht den OneDrive-Bestand und ermittelt sowohl die vollständige Größe als auch den tatsächlich auf dem Datenträger belegten Speicherplatz.

Damit bekommt man genau die beiden Werte, die auch beim manuellen Blick auf die Ordnereigenschaften interessant sind.

Praktisch für größere OneDrive-Umgebungen

Für einen einzelnen privaten Rechner kann man natürlich einfach die Eigenschaften des OneDrive-Ordners öffnen.

Bei mehreren Geräten wird das schnell uninteressant.

Genau dort sehe ich den eigentlichen Vorteil einer PowerShell-Lösung.

Ein solches Skript lässt sich beispielsweise einsetzen, um herauszufinden:

  • wie groß der komplette OneDrive-Bestand eines Benutzers ist
  • wie viel davon wirklich lokal gespeichert wird
  • ob ein Rechner ungewöhnlich viel OneDrive-Inhalt heruntergeladen hat
  • wie stark Files On-Demand tatsächlich Speicher spart

Gerade bei Notebooks mit kleineren SSDs kann das durchaus nützlich sein.

Beispiel: 300 GB OneDrive heißt nicht 300 GB auf der SSD

Angenommen, ein Benutzer besitzt insgesamt 300 GB Daten in seinem OneDrive.

Im Explorer kann der OneDrive-Ordner entsprechend eine Größe von rund 300 GB anzeigen.

Das bedeutet aber nicht automatisch, dass auch 300 GB der SSD belegt sind.

Sind die meisten Dateien lediglich online verfügbar und nur 25 GB wurden tatsächlich heruntergeladen, kann die Größe auf Datenträger entsprechend wesentlich geringer ausfallen.

Genau dieser Unterschied ist bei einer Analyse wichtig.

Sonst könnte man ziemlich schnell zu dem Schluss kommen:

„OneDrive belegt 300 GB.“

obwohl der Rechner lokal vielleicht nur einen Bruchteil davon speichert.

Files On-Demand ist dabei der entscheidende Punkt

Microsoft hat OneDrive bewusst so aufgebaut, dass große Cloud-Bestände nicht vollständig auf jedes Gerät heruntergeladen werden müssen.

Der Explorer zeigt die Dateien trotzdem so an, als wären sie Bestandteil des normalen Dateisystems.

Erst beim Zugriff werden reine Cloud-Dateien bei Bedarf heruntergeladen.

Für den Anwender ist das komfortabel.

Für Administratoren macht es die Frage nach dem tatsächlichen Speicherverbrauch allerdings etwas interessanter.

Die logische Dateigröße allein reicht dafür eben nicht mehr aus.

Mein Eindruck

Ich mag solche kleinen PowerShell-Lösungen, weil sie ein Problem lösen, das im ersten Moment ziemlich banal klingt.

„Wie groß ist mein OneDrive?“

Eigentlich eine einfache Frage.

Bis man merkt, dass damit entweder die gesamte Datenmenge in OneDrive oder der tatsächlich belegte Speicherplatz auf dem Rechner gemeint sein kann.

Und plötzlich sind es zwei völlig unterschiedliche Werte.

Gerade für Administration, Support und Speicheranalysen ist es deshalb praktisch, beide Zahlen automatisiert ermitteln zu können.

Fazit

OneDrive unterscheidet durch Files On-Demand zwischen der vollständigen Größe eines Datenbestands und dem tatsächlich belegten Speicherplatz auf dem lokalen Datenträger.

Während PowerShell die normale Dateigröße problemlos auslesen kann, ist für den realen Platzbedarf etwas mehr Aufwand notwendig.

Das vorgestellte Skript nutzt deshalb die Windows-Funktion:

GetCompressedFileSizeW

über .NET und P/Invoke.

Mit Get_OD_SizeOnDisk.ps1 lassen sich anschließend beide Werte automatisiert ermitteln.

Gerade auf Rechnern mit großen OneDrive-Beständen ist das deutlich aussagekräftiger als einfach nur die Summe aller Dateien zu betrachten.

Denn bei OneDrive gilt eben:

Was im Explorer 300 GB groß aussieht, muss auf der SSD noch lange keine 300 GB belegen.

Quellen

GitHub – OneDrive_SizeOnDisk:
https://github.com/damienvanrobaeys/OneDrive_SizeOnDisk