diff --git a/tools/heim-abholen.ps1 b/tools/heim-abholen.ps1 index 951e2a8..8531c5d 100644 --- a/tools/heim-abholen.ps1 +++ b/tools/heim-abholen.ps1 @@ -49,6 +49,31 @@ function Schlecht($t) { Write-Host " $t" -ForegroundColor Red } $MUSTER = @('*.tar.gz', '*.db.gz') +# Das Datum aus dem NAMEN lesen, nicht aus dem Zeitstempel der Datei. +# +# WARUM: der Nextcloud-Client setzt LastWriteTime auf den Zeitpunkt des +# HERUNTERLADENS. Ein Archiv vom 11. August, das heute ankommt, sieht damit +# taufrisch aus -- und der Alarm "es kommt nichts mehr an" würde nie +# auslösen, weil alles immer neu wirkt. Genau das ist beim ersten echten Lauf +# passiert: "d4rk_media-2026-08-11-2307.tar.gz, 0 Tage alt". +# +# Der Name trägt das Datum der SICHERUNG, und der überlebt jedes Kopieren: +# d4rk_media-2026-08-13-0929.tar.gz +# d4rkbot-2026-08-13.db.gz +function ArchivDatum($datei) { + if ($datei.Name -match '(\d{4})-(\d{2})-(\d{2})(?:-(\d{2})(\d{2}))?') { + $std = if ($Matches[4]) { [int]$Matches[4] } else { 0 } + $min = if ($Matches[5]) { [int]$Matches[5] } else { 0 } + try { + return Get-Date -Year ([int]$Matches[1]) -Month ([int]$Matches[2]) -Day ([int]$Matches[3]) ` + -Hour $std -Minute $min -Second 0 + } catch { } + } + # Kein Datum im Namen -- dann bleibt nur der Zeitstempel, mit allen + # Nachteilen. Besser als gar keine Reihenfolge. + return $datei.LastWriteTime +} + # -- Als Aufgabe eintragen ------------------------------------------------------ if ($Einrichten) { @@ -172,12 +197,13 @@ robocopy $qVoll $zVoll @MUSTER /XO /R:2 /W:5 /NP /NJH /NJS /NDL /NC /NS | Out-Nu # robocopy meldet ueber den Rueckgabewert: alles unter 8 ist Erfolg. if ($LASTEXITCODE -ge 8) { Schlecht "robocopy meldet Fehler ($LASTEXITCODE)"; exit 1 } $nachher = & $zaehlen -Gut "$($nachher - $vorher) neu, $nachher insgesamt" +$inQuelle = @(Get-ChildItem $qVoll -File | Where-Object { $_.Name -match '\.(tar|db)\.gz$' }).Count +Gut "$($nachher - $vorher) neu, $nachher in der Ablage, $inQuelle in der Quelle" # -- Ausdünnen ------------------------------------------------------------------ $alle = @(Get-ChildItem $zVoll -File | Where-Object { $_.Name -match '\.(tar|db)\.gz$' } | - Sort-Object LastWriteTime -Descending) + Sort-Object @{ Expression = { ArchivDatum $_ } } -Descending) if ($alle.Count -gt $Behalten) { Schritt "Alte Staende entfernen (mehr als $Behalten)" $alle | Select-Object -Skip $Behalten | ForEach-Object { @@ -194,7 +220,7 @@ if (-not $neuestes) { $text = 'In der Ablage liegt KEINE einzige Sicherung.' Schlecht $text } else { - $tage = [math]::Round(((Get-Date) - $neuestes.LastWriteTime).TotalDays, 1) + $tage = [math]::Round(((Get-Date) - (ArchivDatum $neuestes)).TotalDays, 1) if ($tage -gt $AlarmNachTagen) { $text = "Die neueste Sicherung ist $tage Tage alt ($($neuestes.Name)). Es kommt nichts mehr an." Schlecht $text