# =================================================================== # Richtet die automatische Sicherungskopie EINMALIG ein. # # Danach holt sich dieser Rechner die Server-Sicherungen von allein -- # taeglich, ohne dass jemand daran denken muss. # # Ausfuehren: powershell -ExecutionPolicy Bypass -File tools\sicherung-einrichten.ps1 # # Braucht KEINE Administratorrechte: Die Aufgabe wird nur fuer den # angemeldeten Benutzer angelegt und laeuft in dessen Namen. # =================================================================== $ErrorActionPreference = 'Stop' $Name = 'Dogfather Workspace - Sicherung holen' $Skript = Join-Path $PSScriptRoot 'sicherung-holen.sh' $Ziel = Join-Path $env:USERPROFILE 'Documents\Obelix\Sicherungen\workspace' Write-Host '' Write-Host 'Dogfather Workspace - automatische Sicherungskopie' -ForegroundColor Cyan Write-Host '---------------------------------------------------' # --- 1. Git Bash finden --------------------------------------------------- # Das Abholskript ist ein Bash-Skript. PowerShell kann es nicht selbst # ausfuehren, es braucht die bash.exe, die mit Git fuer Windows kommt. $Bash = $null foreach ($p in @( "$env:ProgramFiles\Git\bin\bash.exe", "${env:ProgramFiles(x86)}\Git\bin\bash.exe", "$env:LOCALAPPDATA\Programs\Git\bin\bash.exe" )) { if (Test-Path $p) { $Bash = $p; break } } if (-not $Bash) { $g = Get-Command git -ErrorAction SilentlyContinue if ($g) { $k = Join-Path (Split-Path (Split-Path $g.Source)) 'bin\bash.exe' if (Test-Path $k) { $Bash = $k } } } if (-not $Bash) { throw 'bash.exe nicht gefunden. Git fuer Windows ist noetig.' } Write-Host " Bash: $Bash" if (-not (Test-Path $Skript)) { throw "Skript nicht gefunden: $Skript" } Write-Host " Skript: $Skript" Write-Host " Ziel: $Ziel" # --- 2. Vorhandene Aufgabe entfernen ------------------------------------- # Damit ein zweiter Aufruf nicht scheitert, sondern die Einstellungen # schlicht auffrischt. $vorhanden = Get-ScheduledTask -TaskName $Name -ErrorAction SilentlyContinue if ($vorhanden) { Unregister-ScheduledTask -TaskName $Name -Confirm:$false Write-Host ' Alte Aufgabe entfernt.' } # --- 3. Aufgabe anlegen --------------------------------------------------- # Bash braucht einen Unix-Pfad, deshalb die Umschreibung von # C:\Users\... auf /c/Users/... $SkriptUnix = '/' + ($Skript -replace ':', '' -replace '\\', '/') $SkriptUnix = $SkriptUnix.Substring(0,2).ToLower() + $SkriptUnix.Substring(2) $Aktion = New-ScheduledTaskAction -Execute $Bash ` -Argument "-lc `"'$SkriptUnix'`"" # Taeglich, nicht woechentlich: Der Lauf dauert Sekunden und kostet # nichts. Bei woechentlich waere die Kopie im schlimmsten Fall sechs Tage # alt -- bei taeglich hoechstens einen. # # 13:30 statt nachts: Dieser Rechner laeuft nicht durch. Eine Uhrzeit # mitten am Tag wird oefter getroffen als drei Uhr morgens. $Ausloeser = New-ScheduledTaskTrigger -Daily -At '13:30' # StartWhenAvailable ist der wichtigste Schalter hier: War der Rechner # zur eigentlichen Zeit aus, holt Windows den Lauf beim naechsten # Hochfahren nach. Ohne ihn faellt jeder verpasste Termin ersatzlos aus. $Einstellungen = New-ScheduledTaskSettingsSet ` -StartWhenAvailable ` -DontStopIfGoingOnBatteries ` -AllowStartIfOnBatteries ` -ExecutionTimeLimit (New-TimeSpan -Minutes 20) ` -MultipleInstances IgnoreNew $Anmeldung = New-ScheduledTaskPrincipal -UserId "$env:USERDOMAIN\$env:USERNAME" ` -LogonType Interactive -RunLevel Limited Register-ScheduledTask -TaskName $Name -Action $Aktion -Trigger $Ausloeser ` -Settings $Einstellungen -Principal $Anmeldung ` -Description ('Holt taeglich die Sicherungen des Creator Workspace vom Server, ' + 'prueft sie und meldet sich beim Server zurueck.') | Out-Null Write-Host ' Aufgabe angelegt: taeglich 13:30, verpasste Laeufe werden nachgeholt.' -ForegroundColor Green # --- 4. Sofort einmal laufen lassen -------------------------------------- # Eine Einrichtung, die man nicht gleich ausprobiert, ist eine Vermutung. Write-Host '' Write-Host 'Probelauf ...' -ForegroundColor Cyan Start-ScheduledTask -TaskName $Name Start-Sleep -Seconds 12 $info = Get-ScheduledTaskInfo -TaskName $Name if ($info.LastTaskResult -eq 0) { Write-Host ' Probelauf erfolgreich.' -ForegroundColor Green } else { Write-Host " Probelauf meldet Code $($info.LastTaskResult) - bitte das Protokoll ansehen." -ForegroundColor Yellow } $prot = Join-Path $Ziel 'lauf-protokoll.txt' if (Test-Path $prot) { Write-Host '' Write-Host 'Letzte Zeilen aus dem Protokoll:' Get-Content $prot -Tail 3 | ForEach-Object { Write-Host " $_" } } Write-Host '' Write-Host 'Fertig. Ab jetzt laeuft das von allein.' -ForegroundColor Green Write-Host 'Nachsehen kann man es unter Automationen - Sicherung & Zustand,' Write-Host 'dort steht, wie alt die Kopie auf diesem Rechner ist.' Write-Host ''