Aktionen

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:\> 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.

Hinweis:Natürlich kann die Ausführung des Skriptes eine ganze weile dauern, schließlich fragt es tatsächlich jede Datei einmal ab um den echten letzten Zeitpunkt zu ermitteln.

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

Kommentare

Loading comments...