#requires -Version 5.1 <# .SYNOPSIS Fragt nach und richtet optional die taeglichen Scoop-Auto-Updates ein. .DESCRIPTION Eigenstaendig ausfuehrbar, ohne Bucket-Migration. Bei y wird auto-update.ps1 heruntergeladen und eine Aufgabe fuer taeglich 03:00 Uhr erstellt. Die Aufgabe startet das Updateskript verborgen und holt verpasste Termine nach, sobald die Benutzersitzung und eine Netzwerkverbindung verfuegbar sind. Bei n wird nichts eingerichtet; bestehende Aufgaben bleiben unveraendert. .EXAMPLE .\scripts\setup-auto-update.ps1 #> [CmdletBinding()] param( [string] $ScoopRoot = $(if ($env:SCOOP) { $env:SCOOP } else { Join-Path $env:USERPROFILE 'scoop' }) ) $ErrorActionPreference = 'Stop' $ScoopRoot = [IO.Path]::GetFullPath($ScoopRoot) $repository = 'https://gitea.medelexis.ch/public/scoop' do { $autoUpdateAnswer = (Read-Host 'Scoop Auto-Update einschalten? [y/n]').Trim().ToLowerInvariant() } while ($autoUpdateAnswer -notin @('y', 'n')) if ($autoUpdateAnswer -eq 'y') { $scoopCommand = Join-Path $ScoopRoot 'shims\scoop.ps1' if (-not (Test-Path -LiteralPath $scoopCommand -PathType Leaf)) { throw "Scoop wurde nicht gefunden: $scoopCommand" } $autoUpdateDirectory = Join-Path $ScoopRoot 'scripts\medelexis' New-Item -ItemType Directory -Path $autoUpdateDirectory -Force | Out-Null $autoUpdateScript = Join-Path $autoUpdateDirectory 'auto-update.ps1' $downloadPath = Join-Path $autoUpdateDirectory ('auto-update-{0}.download' -f [guid]::NewGuid()) try { $autoUpdateUrl = "$repository/raw/branch/master/scripts/auto-update.ps1" Invoke-WebRequest -Uri $autoUpdateUrl -OutFile $downloadPath -UseBasicParsing $parseTokens = $null $parseErrors = $null $downloadedScript = [Management.Automation.Language.Parser]::ParseFile($downloadPath, [ref] $parseTokens, [ref] $parseErrors) if ($parseErrors.Count -gt 0 -or -not $downloadedScript.ParamBlock -or 'ScoopRoot' -notin @($downloadedScript.ParamBlock.Parameters.Name.VariablePath.UserPath)) { throw 'Das heruntergeladene Auto-Update-Skript ist kein gueltiges Updateskript.' } Move-Item -LiteralPath $downloadPath -Destination $autoUpdateScript -Force # Nur die Aufgabe einrichten; das Updateskript wird durch die Aufgabe gestartet. $userId = [Security.Principal.WindowsIdentity]::GetCurrent().Name $userSid = [Security.Principal.WindowsIdentity]::GetCurrent().User.Value $taskName = "Medelexis-Scoop-AutoUpdate-$userSid" $powershell = Join-Path $env:SystemRoot 'System32\WindowsPowerShell\v1.0\powershell.exe' $arguments = '-NoLogo -NoProfile -NonInteractive -WindowStyle Hidden -ExecutionPolicy Bypass -File "{0}" -ScoopRoot "{1}"' -f $autoUpdateScript, $ScoopRoot $action = New-ScheduledTaskAction -Execute $powershell -Argument $arguments $trigger = New-ScheduledTaskTrigger -Daily -At '03:00' $principal = New-ScheduledTaskPrincipal -UserId $userId -LogonType Interactive -RunLevel Limited $settings = New-ScheduledTaskSettingsSet -StartWhenAvailable -RunOnlyIfNetworkAvailable ` -AllowStartIfOnBatteries -DontStopIfGoingOnBatteries -MultipleInstances IgnoreNew ` -ExecutionTimeLimit (New-TimeSpan -Hours 4) Register-ScheduledTask -TaskName $taskName -Action $action -Trigger $trigger ` -Principal $principal -Settings $settings -Force ` -Description 'Scoop taeglich um 03:00 aktualisieren; verpasste Termine nachholen; elexis* auf hold setzen.' | Out-Null Write-Host "Scoop Auto-Update eingeschaltet: $taskName (taeglich 03:00, verpasste Termine nachholen)." Write-Host "Ausfuehrung verborgen unter $userId, sobald der Benutzer angemeldet ist; kein Aufwecken des PCs." } finally { if (Test-Path -LiteralPath $downloadPath) { Remove-Item -LiteralPath $downloadPath } } } else { Write-Host 'Auto-Update nicht eingerichtet. Eine eventuell bestehende Aufgabe bleibt unveraendert.' }