PowerShell Ordnergröße mit letzten echten Änderungsdatum rekursiv 1 Ebene
Aus znilwiki
Changelog:
- 21.07.2026 erste Version
Vorwort
Bei einem Kunden habe ich einen Dateiserver / Fileserver analysiert. Dabei ging es neben den Ordnergrößen auch darum, ob Ordner überhaupt noch genutzt werden.
Problem 1 waren die Zugriffsrechte, im Dateiexplorer wurde vieles unterschlagen, die Abfrage sollte also per PowerShell erfolgen da man diese "als Administrator" ausführen kann.
Problem 2 war der letzte Zugriff. Das Änderungsdatum des Hauptordners ändert sich nicht, wenn die letzte Änderung tiefer im Dateisystem stattfand.
Das nachfolgende Skript gibt so etwas aus:
PS C:\Users\Bernh> E:\Get-FolderStats.ps1 "E:\Seafile\" Name Letzte Änderung Größe (GiB) ---- --------------- ----------- Excel 03.04.2023 13:26:28 1,93 JavaScript-Schulung 12.12.2023 23:47:55 0,01 Test-Daten1 03.07.2026 09:05:36 0,04 Test-Daten2 22.04.2023 08:25:58 50,79 Kundeninstallationen 19.12.2018 09:08:06 12,79 Meine Bibliothek 08.06.2019 06:55:16 0 RoyalTS_Portable 01.06.2022 09:49:42 0,26 TAUSCH 09.11.2020 10:50:03 0,03 Uploads 15.06.2023 16:27:22 0,02 ZNIL-Dokumentation 18.07.2026 00:35:08 0,07
Alphabetisch sortiert, Letzte Änderung entspricht der Realität sowie die Größe in GiB.
Das Skript wurde mit Google Gemini erstellt.
Skript
Als Dateiname habe ich
Get-FolderStats.ps1
gewählt, wegen der Umlaute sollte das Dateiformat UTF-8-BOM sein:
param(
[Parameter(Mandatory=$true)]
[string]$Path
)
# Prüfen, ob der Pfad existiert
if (-not (Test-Path -Path $Path)) {
Write-Error "Der angegebene Pfad '$Path' wurde nicht gefunden."
return
}
# Alle Unterordner der 1. Ebene abrufen
$subfolders = Get-ChildItem -Path $Path -Directory
$results = foreach ($folder in $subfolders) {
# Alle Dateien im Unterordner rekursiv abrufen
$files = Get-ChildItem -Path $folder.FullName -Recurse -File -ErrorAction SilentlyContinue
if ($files) {
# Summe der Dateigrößen in GiB berechnen (1GB in PS entspricht 1024^3 Bytes, also 1 GiB)
$totalBytes = ($files | Measure-Object -Property Length -Sum).Sum
$sizeGiB = [math]::Round($totalBytes / 1GB, 2)
# Neuestes Änderungsdatum aller enthaltenen Dateien ermitteln
$lastModified = ($files | Measure-Object -Property LastWriteTime -Maximum).Maximum
} else {
# Falls der Ordner komplett leer ist oder keine Dateien enthält
$sizeGiB = 0
$lastModified = $folder.LastWriteTime
}
# Objekt für die Ausgabe erstellen
[PSCustomObject]@{
Name = $folder.Name
'Letzte Änderung' = $lastModified
'Größe (GiB)' = $sizeGiB
}
}
# Alphabetisch nach Name sortieren und als Tabelle ausgeben
$results | Sort-Object Name | Format-Table -AutoSize