Es ist wieder Zeit für ein Wochenendprojekt, und heute lernen Sie, wie Sie ein leichtes System Tray PowerShell Formularmenü erstellen, mit dem Sie Ihre begehrtesten PowerShell-Skripte schnell und einfach starten können. Das Endergebnis sehen Sie unten.

In diesem Artikel erfahren Sie, wie Sie Ihr eigenes PowerShell-Menü erstellen, indem Sie den Prozess Schritt für Schritt aufschlüsseln.
Umgebung und Wissensanforderungen
Bevor Sie eintauchen, stellen Sie bitte sicher, dass Sie die folgenden Mindestanforderungen erfüllen:
- Windows 7 oder neuer
- Windows PowerShell 3 oder neuer – Die neueste Version von .NET Core 3.0 mit PowerShell 7 Preview könnte aufgrund der vor kurzem hinzugefügten Unterstützung für WPF und WinForm auf Windows funktionieren, ist jedoch ungetestet.
- .NET Framework 4.5 oder neuer
- A familiarity with Windows Forms (WinForms) You can, however, due this with WPF too though.
Für dieses Projekt ist die gute Nachricht, dass Sie sich nicht wirklich auf Visual Studio, PoshGUI oder ein anderes UI-Entwicklungstool verlassen müssen, da sich dieses Projekt hauptsächlich auf die folgenden Hauptkomponenten verlässt:
- NotifyIcon – Dies wird unser anpassbares Symbol im System Tray repräsentieren, mit dem der Benutzer interagieren kann.
- Kontextmenü – Container für das Rechtsklicken des Benutzers auf das Benachrichtigungssymbol.
- Menüpunkt – Einzelne Objekte für jede Option im Rechtsklick-Menü.
Öffnen Sie Ihren bevorzugten PowerShell-Skripteditor und lassen Sie uns beginnen!
Für dieses Projekt erstellen Sie drei Funktionen: zwei Funktionen zum Anzeigen/Ausblenden der Konsole, um eine übersichtlichere Benutzererfahrung zu bieten, und eine Funktion zum Hinzufügen von Elementen zu Ihrem Systray-Menü. Diese Funktionen dienen als Grundlage für spätere Verwendungen, um Ihnen das Leben später in diesem Artikel zu erleichtern.
Konsolefenster anzeigen/ausblenden
Wenn nicht ausgeblendet, wird beim Starten eines PowerShell-Skripts die vertraute PowerShell-Konsole angezeigt. Da die Menüpunkte im von Ihnen erstellten PowerShell-Formular Skripte starten werden, sollten Sie sicherstellen, dass die Konsole nicht angezeigt wird. Sie möchten nur, dass sie ausgeführt wird.
Wenn ein Skript ausgeführt wird, können Sie das PowerShell-Konsolenfenster ein- oder ausblenden, indem Sie ein wenig .NET verwenden.
Zuerst fügen Sie den Fenster .NET-Typ zur aktuellen Sitzung hinzu. Verwenden Sie dazu etwas C#, wie unten gezeigt. Die beiden Methoden, die Sie in den Kontext laden müssen, sind GetConsoleWindow und ShowWindow. Durch das Laden dieser DLLs in den Speicher werden bestimmte Teile der API freigelegt. Dadurch können Sie sie im Kontext Ihres PowerShell-Skripts verwenden:
Erstellen Sie zwei Funktionen, die die oben geladenen mit der GetConsoleWindow()
– und ShowWindow()
-Methode verwenden, wie unten gezeigt.
Mit diesen beiden Funktionen haben Sie nun eine Möglichkeit geschaffen, das Konsolenfenster nach Belieben anzuzeigen oder auszublenden.
Hinweis: Wenn Sie die Ausgabe der über das Menü ausgeführten Skripte sehen möchten, können Sie PowerShell-Transkripte oder andere textbasierte Protokollfunktionen verwenden. Dies ermöglicht es Ihnen, die Kontrolle zu behalten, anstatt die PowerShell-Sitzung nur mit dem WindowStyle-Parameter zum Ausblenden auszuführen.
Beginnen Sie nun mit dem Aufbau des Skriptcodes, indem Sie Start-HideConsole
aufrufen. Wenn das menügesteuerte PowerShell-Formularskript ausgeführt wird, stellt dies sicher, dass das PowerShell-Konsolenfenster nicht angezeigt wird.
Menüoptionen erstellen
Jetzt ist es an der Zeit, die Menüoptionen zu erstellen. Stellen Sie sicher, dass Sie später problemlos neue Optionen erstellen können, indem Sie eine weitere Funktion namens New-MenuItem
erstellen. Wenn Sie diese Funktion aufrufen, erstellt sie ein neues MenuItem .NET-Objekt, das Sie später dem Menü hinzufügen können.
Jede Menüoption startet ein anderes Skript oder beendet den Startvorgang. Um diese Funktionalität zu berücksichtigen, hat die New-MenuItem
-Funktion drei Parameter:
Text
– Die Bezeichnung, auf die der Benutzer klicken wirdMyScriptPath
– Der Pfad zum auszuführenden PowerShell-SkriptExitOnly
– Die Option, den Startvorgang zu beenden.
Fügen Sie den folgenden Funktionsschnipsel zum Menüskript hinzu.
Setzen Sie den Aufbau der Funktion New-MenuItem
fort, indem Sie dem MenuItem-Objekt eine Variable zuweisen.
Weisen Sie anschließend das Textlabel dem Menüpunkt zu.
Fügen Sie nun dem MenuItem eine benutzerdefinierte Eigenschaft mit dem Namen MyScriptPath
hinzu. Über diesen Pfad wird das Skript aufgerufen, wenn auf den Menüpunkt geklickt wird.
Fügen Sie ein Klickereignis zum MenuItem hinzu, das das gewünschte Skript startet. Start-Process bietet eine saubere Möglichkeit, dies innerhalb eines try/catch-Blocks zu tun, damit Sie sicherstellen können, dass etwaige Fehler beim Starten des Skripts (wie das Fehlen von PowerShell oder das Nichtvorhandensein des Skripts am angegebenen Pfad) in Ihren Catch-Block fallen.
Fügen Sie die verbleibende Logik hinzu, um eine Beendigungsbedingung für den Launcher bereitzustellen, gefolgt von der Rückgabe Ihres neu erstellten MenuItems, um einer anderen Variablen zur Laufzeit zugewiesen zu werden.
Sie sollten jetzt die New-MenuItem
-Funktion erstellt haben! Die endgültige Funktion sollte so aussehen:
Testen Sie die Funktion New-MenuItem
, indem Sie den obigen Code in Ihre PowerShell-Konsole kopieren und einfügen und die Funktion unter Verwendung einiger erfundener Parameterwerte ausführen. Sie sehen, dass ein .NET MenuItem-Objekt zurückgegeben wird.
Erstellen eines Startformulars
Möchten Sie mehr Tipps wie diesen? Besuchen Sie meinen persönlichen PowerShell-Blog unter: https://nkasco.com/FriendsOfATA
Jetzt, da Sie problemlos neue Menüpunkte erstellen können, ist es an der Zeit, einen System-Tray-Startbildschirm zu erstellen, der das Menü anzeigt.
Erstellen Sie ein einfaches Formularobjekt, um Komponenten hinzuzufügen. Dies muss nichts Besonderes sein, da es für den Endbenutzer ausgeblendet wird und die Konsole im Hintergrund weiterläuft.
Als Nächstes erstellen Sie das Symbol, das im Systembereich angezeigt wird. Im folgenden Beispiel habe ich mich für das PowerShell-Symbol entschieden. Zur Laufzeit erstellt der folgende Code ein tatsächliches Symbol im Systembereich. Dieses Symbol kann nach Belieben angepasst werden, indem die Variable SystrayIcon
auf das gewünschte Symbol festgelegt wird.
Schauen Sie sich die Dokumentation für die Klasse System.Drawing.Icon an, um weitere Methoden zum Laden eines Symbols in den Speicher zu sehen.
Wenn das Skript ausgeführt wird, sollte das PowerShell-Symbol im Systembereich angezeigt werden, wie unten gezeigt.
Erstellen Sie nun einen Container für Ihre Menüpunkte mit einem neuen ContextMenu-Objekt und erstellen Sie alle Ihre Menüpunkte. In diesem Beispiel soll das Menü zwei Skripte zum Ausführen und eine Option zum Beenden enthalten.
Fügen Sie als Nächstes alle gerade erstellten Menüpunkte dem Kontextmenü hinzu. Dadurch werden alle Menüoptionen im Formular-Kontextmenü angezeigt.
Zeigen Sie das Launcher-Formular an.
Jetzt, da das Formular vollständig ist, müssen Sie es nur noch anzeigen und sicherstellen, dass das PowerShell-Konsolenfenster nicht angezeigt wird. Dies erreichen Sie, indem Sie Start-HideConsole
verwenden, das Launcher-Formular anzeigen und dann die Konsole wieder mit Start-ShowConsole
anzeigen, um einen blockierten powershell.exe-Prozess zu verhindern.
Möchten Sie mehr Tipps wie diesen? Schauen Sie sich meinen persönlichen PowerShell-Blog an unter: https://nkasco.com/FriendsOfATA
Der vollständige Code in seiner Gesamtheit ist hier zu finden: https://github.com/nkasco/PSSystrayLauncher
Ihre Mitnahmen
Herzlichen Glückwunsch, Sie haben dieses Projekt abgeschlossen! In diesem Artikel haben Sie gelernt:
- Wie man Komponenten der Windows API freilegt.
- Wie man mit Kontextmenüs über WinForms arbeitet und anschließend Menüpunkte hinzufügt.
- Wie man ein System Tray-Symbol in PowerShell erstellt.
Dieses Projekt sollte Ihnen genügend Verständnis und Erfahrung geben, um Ihr eigenes Systray-Menü für Ihre PowerShell-Skripte zu erstellen!