feat(installer): kein Konsolenfenster (.vbs-Starter) + Rippy-Icon im Installer-Fenster
Ampel / ampel (push) Successful in 28s

Commander-Wunsch: kein Konsolenfenster + Icon.
- Starter ist jetzt eine .vbs (statt .bat): wscript startet PowerShell mit
  Fensterstil 0 = KOMPLETT versteckt, kein Konsolenfenster. Nur das
  WinForms-Installer-Fenster erscheint. Download-Datei: rippy-worker-setup.vbs
  (weiter CLIENT-seitig mit eingetragener LAN-IP erzeugt).
- install-gui.ps1: Fenster-Icon = Rippy-Disc (zur Laufzeit gezeichnet,
  Indigo-Kreis + weisses Loch) — erscheint in Titelleiste + Taskleiste.
  (Die Datei selbst kann Windows-bedingt kein Icon tragen — nur .exe/.lnk.)

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
Hitonabi
2026-07-24 19:03:19 +02:00
parent b337525bed
commit b1d9ece9b2
2 changed files with 29 additions and 17 deletions
+11
View File
@@ -26,6 +26,17 @@ $form.MaximizeBox = $false
$form.BackColor = [System.Drawing.Color]::FromArgb(248, 250, 252) $form.BackColor = [System.Drawing.Color]::FromArgb(248, 250, 252)
$form.Font = New-Object System.Drawing.Font("Segoe UI", 9) $form.Font = New-Object System.Drawing.Font("Segoe UI", 9)
# Fenster-Icon: Rippy-Disc zur Laufzeit zeichnen (Indigo-Kreis + weisses Loch)
# - kein externes .ico noetig. Erscheint in Titelleiste und Taskleiste.
try {
$ibmp = New-Object System.Drawing.Bitmap 32, 32
$ig = [System.Drawing.Graphics]::FromImage($ibmp)
$ig.SmoothingMode = "AntiAlias"
$ig.FillEllipse((New-Object System.Drawing.SolidBrush ([System.Drawing.Color]::FromArgb(79, 70, 229))), 1, 1, 30, 30)
$ig.FillEllipse([System.Drawing.Brushes]::White, 12, 12, 8, 8)
$form.Icon = [System.Drawing.Icon]::FromHandle($ibmp.GetHicon())
} catch {}
$titel = New-Object System.Windows.Forms.Label $titel = New-Object System.Windows.Forms.Label
$titel.Text = "Rippy Encoding-Worker einrichten" $titel.Text = "Rippy Encoding-Worker einrichten"
$titel.Font = New-Object System.Drawing.Font("Segoe UI", 14, [System.Drawing.FontStyle]::Bold) $titel.Font = New-Object System.Drawing.Font("Segoe UI", 14, [System.Drawing.FontStyle]::Bold)
+18 -17
View File
@@ -91,28 +91,28 @@ export default function WorkerVerwaltung() {
}) })
} }
// Grafischer Installer: erzeugt eine .bat CLIENT-seitig mit der eingetragenen // Grafischer Installer: erzeugt eine .vbs CLIENT-seitig mit der eingetragenen
// LAN-IP (der Browser kennt sie, die API nicht sicher). Doppelklick lädt den // LAN-IP (der Browser kennt sie, die API nicht sicher). Doppelklick startet
// WinForms-Installer von Rippy und startet ihn — kein CLI mehr. // via wscript PowerShell KOMPLETT VERSTECKT (kein Konsolenfenster) und lädt
// den WinForms-Installer von Rippy — nur das Installer-Fenster erscheint.
const guiInstallerHerunterladen = () => { const guiInstallerHerunterladen = () => {
const host = rippyHost.trim() const host = rippyHost.trim()
if (!host) { toast('error', 'Erst die LAN-IP der Rippy-Maschine eintragen'); return } if (!host) { toast('error', 'Erst die LAN-IP der Rippy-Maschine eintragen'); return }
const psInner = `try { Invoke-WebRequest 'http://${host}/api/worker-setup/windows-gui' -OutFile ($env:TEMP + '\\rippy-gui.ps1') -UseBasicParsing; & ($env:TEMP + '\\rippy-gui.ps1') -RippyHost '${host}' } catch { Write-Host $_.Exception.Message -ForegroundColor Red; Read-Host 'Fehler - Enter zum Schliessen' }` const ps = `try { Invoke-WebRequest 'http://${host}/api/worker-setup/windows-gui' -OutFile ($env:TEMP + '\\rippy-gui.ps1') -UseBasicParsing; & ($env:TEMP + '\\rippy-gui.ps1') -RippyHost '${host}' } catch { Add-Type -AssemblyName System.Windows.Forms; [void][System.Windows.Forms.MessageBox]::Show($_.Exception.Message, 'Rippy Installer') }`
const bat = [ // VBScript verdoppelt innere Anführungszeichen; Fensterstil 0 = versteckt
'@echo off', const psEscaped = ps.replace(/"/g, '""')
'title Rippy Worker Setup', const vbs = [
'echo.', "' Rippy Encoding-Worker - grafische Installation (ohne Konsolenfenster)",
`echo Starte grafischen Rippy-Worker-Installer von ${host} ...`, 'Set sh = CreateObject("WScript.Shell")',
'echo.', `sh.Run "powershell -NoProfile -WindowStyle Hidden -ExecutionPolicy Bypass -STA -Command ""${psEscaped}""", 0, False`,
`powershell -NoProfile -ExecutionPolicy Bypass -STA -Command "${psInner}"`,
].join('\r\n') ].join('\r\n')
const blob = new Blob([bat], { type: 'application/octet-stream' }) const blob = new Blob([vbs], { type: 'application/octet-stream' })
const a = document.createElement('a') const a = document.createElement('a')
a.href = URL.createObjectURL(blob) a.href = URL.createObjectURL(blob)
a.download = 'rippy-worker-setup.bat' a.download = 'rippy-worker-setup.vbs'
document.body.appendChild(a); a.click(); a.remove() document.body.appendChild(a); a.click(); a.remove()
URL.revokeObjectURL(a.href) URL.revokeObjectURL(a.href)
toast('success', 'rippy-worker-setup.bat heruntergeladen — doppelklicken zum Installieren') toast('success', 'rippy-worker-setup.vbs heruntergeladen — doppelklicken zum Installieren')
} }
return ( return (
@@ -232,11 +232,12 @@ export default function WorkerVerwaltung() {
Fenster ausfüllen, Installieren". Braucht nur Python 3.10+ auf dem PC — kein Docker, kein git. Fenster ausfüllen, Installieren". Braucht nur Python 3.10+ auf dem PC — kein Docker, kein git.
</p> </p>
<Button variant="amber" onClick={guiInstallerHerunterladen} disabled={!rippyHost.trim()}> <Button variant="amber" onClick={guiInstallerHerunterladen} disabled={!rippyHost.trim()}>
<Download size={16} /> Grafischen Installer herunterladen (.bat) <Download size={16} /> Grafischen Installer herunterladen
</Button> </Button>
<p className="text-xs text-slate-500 dark:text-slate-400"> <p className="text-xs text-slate-500 dark:text-slate-400">
Windows warnt beim Doppelklick evtl. („Windows hat Ihren PC geschützt") Weitere Informationen" Öffnet direkt das Installer-Fenster — kein Konsolenfenster. Windows warnt beim Doppelklick evtl.
→ „Trotzdem ausführen". Die .bat lädt den Installer nur von deiner Rippy-Maschine. („Windows hat Ihren PC geschützt") Weitere Informationen" → „Trotzdem ausführen". Die Datei
lädt den Installer nur von deiner Rippy-Maschine.
</p> </p>
</div> </div>
)} )}