====== Tutorial: Script-Command erstellen ====== Dieses Tutorial zeigt, wie ein PowerShell-Script als vollwertiger Command im Host registriert wird. Am Ende steht ein Add-in, das einen Script-Command deklariert, ein ''.ps1''-Script ausführt und über das ''##wvds''-Protokoll mit dem Host kommuniziert — Fortschrittsanzeige, Benachrichtigungen und alles, was dazugehört. Zurück zur [[..:start|Übersicht]]. ===== Voraussetzungen ===== * PowerShell 7+ (''pwsh.exe'') im Systempfad * WvdS Host Shell (installiert und lauffähig) * Ein beliebiger Texteditor für ''.ps1''- und ''.json''-Dateien Ein FPC-Compiler ist für Script-Commands **nicht nötig** — es wird keine DLL kompiliert. ===== Projektstruktur ===== csv-export/ ├── plugin.json ← Manifest ├── package.nls.json ← Standard-Übersetzung ├── media/ │ └── export-csv.svg ← Command-Icon └── scripts/ └── export-csv.ps1 ← PowerShell-Script Im Unterschied zu nativen Add-ins gibt es keinen ''bin/''-Ordner und keine DLL. Das gesamte Add-in besteht aus dem Manifest und dem Script. ===== Schritt 1: Manifest erstellen ===== Die Datei ''plugin.json'' deklariert den Script-Command. Das entscheidende Feld ist ''kind: "script"'', das den Host anweist, kein DLL-Laden auszulösen, sondern das angegebene Script zu starten. { "id": "wvds.csv-export", "name": "csv-export", "displayName": "%displayName%", "version": "36.01.25.001", "publisher": "wvds", "kind": "native", "engineVersion": "^1.0.0", "activationEvents": ["onCommand:csv-export.run"], "permissions": [], "contributes": { "commands": [ { "command": "csv-export.run", "title": "%cmdRunTitle%", "category": "Export", "icon": "media/export-csv.svg", "kind": "script", "script": "scripts/export-csv.ps1" } ], "keybindings": [ { "command": "csv-export.run", "key": "Ctrl+Shift+E", "when": "" } ] } } Die Felder ''kind'' und ''script'' im Command-Block sind der einzige Unterschied zu einem nativen Command. Alles andere — ''title'', ''category'', ''icon'', ''keybindings'' — funktioniert identisch. Die NLS-Datei ''package.nls.json'': { "displayName": "CSV-Export", "cmdRunTitle": "CSV-Export ausführen" } ===== Schritt 2: PowerShell-Script schreiben ===== Das Script ''scripts/export-csv.ps1'' ist ein gewöhnliches PowerShell-Script. Es kann das ''WvdSHostContract''-Modul importieren, um strukturiert mit dem Host zu kommunizieren. # WvdS Host-Contract importieren Import-Module "$PSScriptRoot\..\scripts\WvdSHostContract.psm1" # Fortschritt melden Write-HostStatus -Text "CSV-Export gestartet" Write-HostProgress -Percent 0 # Beispiel: Daten verarbeiten $items = @("Eintrag A", "Eintrag B", "Eintrag C", "Eintrag D", "Eintrag E") $total = $items.Count $output = @() for ($i = 0; $i -lt $total; $i++) { $output += $items[$i] $pct = [math]::Floor((($i + 1) / $total) * 100) Write-HostProgress -Percent $pct Write-Output "Verarbeite: $($items[$i])" Start-Sleep -Milliseconds 500 } # Ergebnis speichern $outputPath = "$env:TEMP\export.csv" $output | Out-File -FilePath $outputPath -Encoding UTF8 # Host benachrichtigen Write-HostProgress -Percent 100 Write-HostNotification -Message "CSV-Export abgeschlossen: $outputPath" Drei Dinge passieren hier: * ''Write-HostProgress'' aktualisiert die Fortschrittsanzeige in der StatusBar. * ''Write-Output'' erzeugt reguläre Textausgabe, die im PowerShell-Panel erscheint. * ''Write-HostNotification'' zeigt am Ende eine Toast-Benachrichtigung. ===== Schritt 3: Paket schnüren ===== Das Add-in wird als ''.wvdsx''-Datei (ZIP) verpackt. Die Struktur innerhalb des Archivs entspricht der Projektstruktur: csv-export.wvdsx (ZIP) ├── plugin.json ├── package.nls.json ├── media/ │ └── export-csv.svg └── scripts/ └── export-csv.ps1 Installation über die CLI: WDocHost.exe --install-extension csv-export.wvdsx ===== Schritt 4: Testen ===== Nach der Installation erscheint der Command ''Export: CSV-Export ausführen'' in der CommandPalette. Der Benutzer kann ihn dort aufrufen oder ''Ctrl+Shift+E'' drücken. Beim ersten Aufruf zeigt der Host einen Bestätigungsdialog mit dem Pfad zum Script. Nach Bestätigung: - Das BottomPanel öffnet sich automatisch und wechselt zum PowerShell-Pane. - Ein neuer Tab ''CSV-Export ausführen'' erscheint mit dem ▶-Badge (laufend). - Die Textausgabe (''Verarbeite: ...'') strömt in Echtzeit in den Tab. - Die StatusBar zeigt den Fortschrittsbalken. - Nach Abschluss wechselt der Tab-Badge zu ✓ und die Benachrichtigung erscheint. ===== Was unter der Haube passiert ===== Der Host-interne Ablauf bei einem Script-Command ist kürzer als bei einem nativen Command: - Der Host findet den Command ''csv-export.run'' in der Registry. - Der ''TScriptCommandProxy'' delegiert an den ''TShellScriptHost''. - Der ScriptHost prüft die Genehmigungsliste (Erst-Ausführung → Dialog). - Der ScriptHost startet ''pwsh.exe -NoProfile -NonInteractive -File scripts/export-csv.ps1''. - Ein ''TScriptReaderThread'' liest ''stdout'' zeilenweise. - Zeilen mit ''##wvds[...]''-Prefix werden erkannt, JSON-Payload geparst und an die Shell dispatcht (''Synchronize'' für Thread-Sicherheit). - Normaler Text geht direkt ins ''TWvdSScriptPanel''. - Bei Prozess-Ende wertet der Host den Exit-Code aus und aktualisiert den Tab-Status. Es gibt keine DLL, keinen ABI-Handshake und keine Aktivierungsphase. Das Script läuft als eigenständiger Betriebssystem-Prozess. ===== Erweiterte Szenarien ===== ==== Host-Command aus dem Script aufrufen ==== Ein Script kann registrierte Commands im Host auslösen: Invoke-HostCommand -CommandId "assets.refresh" Dafür muss das Manifest die Berechtigung ''host.commands'' enthalten: "permissions": ["host.commands"] ==== Dokument im Host öffnen ==== Open-HostDocument -Path "C:\Daten\report.pdf" Erfordert ''fs.read'' in den Manifest-Berechtigungen. Weiter zur [[..:sdk:script-host|ScriptHost-Referenz]] oder zurück zur [[..:start|Übersicht]].