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.


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