Der ScriptHost ermöglicht es, PowerShell-Scripts als vollwertige Commands im Host auszuführen. Ein Script-Command wird im Manifest als kind: „script“ deklariert und verweist auf eine .ps1-Datei im Add-in-Paket. Der Host startet das Script als pwsh-Kindprozess, liest dessen Ausgabe asynchron über eine Pipe und stellt sie im PowerShell-Panel des BottomPanels dar.
Ziel dieser Architektur ist es, leichtgewichtige Automatisierungen ohne DLL-Kompilierung und ohne ABI-Handshake zu ermöglichen. Im Unterschied zu nativen Commands, die den vollständigen Aktivierungszyklus (DLL laden, CreatePlugin, Activate) durchlaufen, startet ein Script-Command sofort als Betriebssystem-Prozess. Der Vorteil besteht darin, dass PowerShell-Scripts die gesamte Windows-Infrastruktur nutzen können — Dateisystem, Registry, REST-APIs, COM-Objekte — während sie trotzdem über ein strukturiertes Protokoll mit dem Host kommunizieren.
Zurück zur SDK-Übersicht oder zur Hauptübersicht.
Wenn der Benutzer einen Script-Command auslöst, durchläuft der ScriptHost folgende Schritte:
pwsh.exe -NoProfile -NonInteractive -File <pfad> als Kindprozess mit gepipeter stdout/stderr-Umleitung.stdout zeilenweise. Zeilen mit dem ##wvds[…]-Prefix werden als Host-Nachrichten erkannt und an die Shell dispatcht. Normaler Text geht direkt ins PowerShell-Panel.TerminateProcess an den pwsh-Prozess.Jeder Script-Lauf erscheint als eigener Tab im PowerShell-Panel des BottomPanels. Mehrere Scripts können parallel laufen. Das BottomPanel wird automatisch sichtbar, wenn ein Script startet.
Die Kommunikation zwischen Script und Host läuft über stdout. Der Host erkennt strukturierte Nachrichten an einem Prefix:
##wvds[typ payload]
Normaler Text (ohne ##wvds-Prefix) wird als reguläre Script-Ausgabe im PowerShell-Panel dargestellt.
| Typ | Payload | Host-Aktion |
progress | {„percent“: 67} | Aktualisiert die StatusBar-Fortschrittsanzeige. |
status | {„text“: „Verarbeite Datei 3/10“} | Setzt temporär ein StatusBar-Item. |
notify | {„message“: „Export abgeschlossen“} | Zeigt eine Benachrichtigung im NotificationStack. |
open | {„path“: „C:\\Daten\\report.pdf“} | Öffnet ein Dokument in den DocumentTabs. |
command | {„id“: „assets.refresh“} | Löst einen registrierten Command im Host aus. |
Ein Script, das eine CSV-Datei exportiert und den Fortschritt an den Host meldet:
Write-Output '##wvds[status {"text":"CSV-Export gestartet"}]'
Write-Output '##wvds[progress {"percent":0}]'
$rows = Get-Content -Path $InputFile
$total = $rows.Count
for ($i = 0; $i -lt $total; $i++) {
# ... Verarbeitung ...
$pct = [math]::Floor(($i / $total) * 100)
Write-Output "##wvds[progress {`"percent`":$pct}]"
}
Write-Output '##wvds[progress {"percent":100}]'
Write-Output '##wvds[notify {"message":"CSV-Export abgeschlossen"}]'
Damit Scripts nicht manuell ##wvds[…]-Strings zusammenbauen müssen, liefert der Host das PowerShell-Modul WvdSHostContract mit. Es stellt fünf Cmdlets bereit, die das Protokoll kapseln.
Das Modul liegt im Installationsverzeichnis der Shell unter scripts/WvdSHostContract.psm1. Scripts importieren es explizit:
Import-Module "$PSScriptRoot\..\scripts\WvdSHostContract.psm1"
Write-HostProgress -Percent 67
Sendet ##wvds[progress {„percent“:67}]. Aktualisiert die Fortschrittsanzeige in der StatusBar und im PowerShell-Panel.
Write-HostStatus -Text "Verarbeite Datei 3/10"
Sendet ##wvds[status {„text“:„Verarbeite Datei 3/10“}]. Setzt temporär ein StatusBar-Item mit dem angegebenen Text.
Write-HostNotification -Message "Export abgeschlossen"
Sendet ##wvds[notify {„message“:„Export abgeschlossen“}]. Zeigt eine Toast-Benachrichtigung im NotificationStack der Shell.
Open-HostDocument -Path "C:\Daten\report.pdf"
Sendet ##wvds[open {„path“:„C:\\Daten\\report.pdf“}]. Öffnet das angegebene Dokument in den DocumentTabs.
Invoke-HostCommand -CommandId "assets.refresh"
Sendet ##wvds[command {„id“:„assets.refresh“}]. Löst einen registrierten Command im Host aus. Der Command muss in den Berechtigungen des Add-ins unter host.commands gelistet sein.
Script-Commands unterliegen dem Berechtigungsmodell des Hosts. Folgende Prüfungen gelten:
.ps1-Datei.permissions-Array des Manifests unter host.commands gelistet sind. Nicht autorisierte Aufrufe erzeugen einen Fehler im PowerShell-Panel.fs.read in den Manifest-Berechtigungen.
Das PowerShell-Panel ist ein Pane im BottomPanel der Shell, das über Ctrl+J erreichbar ist. Es zeigt die Ausgabe laufender und abgeschlossener Script-Läufe in einer tabulierten Ansicht.
stderr-Zeilen erscheinen in der Fehler-Farbe des aktiven Themes.Weiter zum Script-Command Tutorial oder zurück zur SDK-Übersicht.