# Startet SwyxTray in der Desktop-Sitzung des angemeldeten Benutzers. # # Hintergrund: Laeuft VS Code remote (SSH, Tunnel), startet dessen Debugger # Prozesse in der Sitzung des VS-Code-Servers - meist Sitzung 0, und dort gibt # es keine Taskleiste, also auch kein Tray-Symbol. Eine geplante Aufgabe ohne # /RU laeuft dagegen mit dem interaktiven Token des Benutzers und landet damit # auf dem Desktop. Braucht keine Administratorrechte. # # Wird von der Aufgabe "SwyxTray im Desktop starten (Debug)" aufgerufen; die # Einzelinstanz-Sperre und der Build sind dann schon erledigt (dependsOn). # # Bewusst KEIN $ErrorActionPreference = 'Stop': Die Aufgabe leitet stderr um, # und in Windows PowerShell 5.1 wird dann jede stderr-Zeile eines nativen # Programms zu einem ErrorRecord - mit 'Stop' bricht das Skript an der Stelle # mit einer irrefuehrenden Meldung ab. Stattdessen wird nach jedem # schtasks-Aufruf $LASTEXITCODE geprueft. param( [Parameter(Mandatory = $true)][string]$Exe ) $taskName = 'SwyxTray.F5' if (-not (Test-Path $Exe)) { Write-Host "FEHLER: Nicht gefunden: $Exe - erst bauen." exit 1 } # Ein soeben beendeter Prozess ist in Get-Process noch kurz als Leiche # sichtbar. Damit die Warteschleife nicht darauf hereinfaellt, zaehlt nur ein # PID, der vorher nicht da war. $before = @(Get-Process SwyxTray -ErrorAction SilentlyContinue | ForEach-Object Id) # /ST ist bei /SC ONCE Pflicht, der Zeitpunkt ist aber ohne Belang: # gestartet wird sofort per /Run, danach wird die Aufgabe wieder entfernt. $created = schtasks /Create /F /TN $taskName /TR "`"$Exe`" --verbose" /SC ONCE /ST 23:59 2>&1 if ($LASTEXITCODE -ne 0) { Write-Host "FEHLER: Geplante Aufgabe konnte nicht angelegt werden: $created" exit 1 } $run = schtasks /Run /TN $taskName 2>&1 if ($LASTEXITCODE -ne 0) { schtasks /Delete /F /TN $taskName 2>&1 | Out-Null Write-Host "FEHLER: Geplante Aufgabe konnte nicht gestartet werden: $run" exit 1 } # Die Aufgabe darf erst weg, wenn sie die EXE gestartet hat - /Run ist # asynchron, ein zu fruehes /Delete wuerde den Start abwuergen. $process = $null foreach ($i in 1..60) { $process = Get-Process SwyxTray -ErrorAction SilentlyContinue | Where-Object { $before -notcontains $_.Id -and -not $_.HasExited } | Select-Object -First 1 if ($process) { break } Start-Sleep -Milliseconds 250 } schtasks /Delete /F /TN $taskName 2>&1 | Out-Null if (-not $process) { Write-Host "FEHLER: SwyxTray ist nicht gestartet - Protokoll unter %LOCALAPPDATA%\SwyxTray pruefen." exit 1 } Write-Host "SwyxTray laeuft (PID $($process.Id), Sitzung $($process.SessionId))." exit 0