Files
swyx/.vscode/start-desktop.ps1
T
Sven 78b17a1350 SwyxTray und Firefox-Plugin in das Repository aufnehmen
Windows-Tray-Anwendung (CLMgr-Anbindung an SwyxIt!) samt WebSocket-Zugang,
Firefox-Erweiterung und Browser-Beispielclient.
2026-08-21 11:33:52 +02:00

68 lines
2.6 KiB
PowerShell

# 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