PowerShell-Scripte können den Arbeitsalltag erleichtern und wiederkehrende Aufgaben erledigen. Oftmals will man das PowerShell-Script allerdings ohne Fenster im Hintergrund ausführen. Denn, insbesondere wenn ein PowerShell-Script auf einem Endwander-System wie einer Computerkasse ausgeführt wird, soll für diesen nicht unbedingt das Konsolenfenster zu sehen sein. Wenn dieses auch administrative Rechte nutzt, könnte ein findiger Anwender das PowerShell-Script stoppen und in einer PowerShell-Konsole einfach Befehle mit Admin-Rechten absetzen und beispielweise die Anwendung schließen und Systemänderungen vornehmen. Erfahre in diesem Artikel verschiedene Möglichkeiten um das PowerShell-Script ohne Fenster auszuführen!
PowerShell-Script ohne Fenster ausführen mit Aufgabenplanung
In der Aufgabenplanung kann man ein PowerShell-Script unsichtbar ohne Fenster ausführen lassen. Allerdings führt das Anlegen einer Aufgabe im Taskplaner unter dem genutzten Benutzeraccount dazu, dass das Fenster sich im Vordergrund öffnet. Dieses würde man beispielsweise so in der Aktion im Task angeben:
1 |
powershell.exe -command C:\Users\Tobias\Desktop\WindowsStyleHidden\NoWindow.ps1 |
Wenn das PowerShell-Script auch mit einem anderen Benutzer oder mit dem Administratorkonto ausgeführt werden kann, dann kann man diesen Benutzer mit seinem Kennwort zur Ausführung hinterlegen. Dadurch wird das Konsolenfenster der PowerShell nicht sichtbar für den Endanwender, da es unter dem anderen Benutzerkonto startet und auch dort abgearbeitet wird. Dies funktioniert aber natürlich nur, wenn keine Aktion im Kontext des eigenen Benutzerkontos (z. B. Screenshot erstellen), benötigt wird.
Ansonsten bieten sich die im Folgenden beschriebenen Methoden und Tools an, um das Fenster auch außerhalb der Aufgabenplanung im Hintergrund verschwinden zu lassen oder in Kombination mit der Aufgabenplanung auch unter dem genutzten Benutzeraccount ausführen zu lassen. Dies könnte z. B. für ein solches PowerShell-Script, das automatisch Screenshots erstellt, Sinn machen.
PowerShell-Script ohne Fenster ausführen mit „WindowStyle Hidden“
Ein Parameter, der für das Ausführen von PowerShell-Scripten oft angeführt wird, ist „WindowStyle“ mit der Option „Hidden“. Es gibt viele Berichte, laut denen dieser Parameter gar nicht funktionieren soll oder nur dann, wenn das PowerShell-Script auch „WindowsForms“ nutzt, also ein Windows-Programmfenster beinhaltet. Leider ist das ganze etwas verwurschtelt und die Lösung ist einfacher als gedacht.
Mit folgendem Befehl wird man beispielsweise keinen Erfolg haben das Konsolenfenster des angegebenen PowerShell-Scriptes in den Hintergrund verschwinden zu lassen:
1 |
powershell.exe -command C:\NoWindow.ps1 -WindowStyle Hiddden |
Mit der folgenden Reihenfolge der Parameter allerdings schon:
1 |
powershell.exe -WindowStyle Hiddden -command C:\NoWindow.ps1 |
Aus welchem Grund auch immer, ist es wichtig, dass der Parameter für den „WindowStyle“ ganz vorne vor dem Pfad zum auszuführenden PowerShell-Script angegeben wird.
Allerdings hat diese Methode gleich mehrere Nachteile:
- Für einen kurzen Moment ist das Konsolenfenster der PowerShell trotzdem zu sehen! Wenn man in dem Moment, in welchem das PowerShell-Script vielleicht per Task in der Aufgabenplanung gestartet wird, an genau die Stelle klicken muss, an welcher das Konsolenfenster erscheint, stört man sich oder den Endanwender dadurch bei seinem eigenen Workflow.
- Danach wird das PowerShell-Fenster lediglich minimiert und erscheint trotzdem als Icon in der Taskleiste und kann somit vom Benutzer auch wieder maximiert werden!
- Das PowerShell-Script muss auf jeden Fall durch Absetzen eines Kommandos gestartet werden, oder man muss eine Verknüpfung mit diesen Parametern erstellen die der Endanwender starten kann.
Laut meiner Recherche ist das Problem wohl, dass die PowerShell in erster Linie als Skriptinterpreter mit Konsolenausgabe entwickelt wurde und es keine EXE-Variante der PowerShell.exe gibt, die komplett „silent“ im Hintergrund läuft.
Nutzen kann man diesen Befehl trotzdem aus einer Kommandozeile, in der Aufgabenplanung, im Ausführen-Dialog oder auch in einer Verknüpfung, die man erstellt, über die ein Endanwender das PowerShell-Script starten kann.
PowerShell-Script ohne Fenster ausführen mit Befehl im PowerShell-Script
Um ein PowerShell-Script ohne den Zusatz „-WindowStyle Hidden“ ausführen zu müssen, z. B. auch wenn man es per Rechtsklick und Klick auf „Mit PowerShell ausführen“ startet, kann man folgenden Code fest in das PowerShell-Script integrieren:
1 2 3 4 5 6 7 8 9 |
# PowerShell-Konsole minimieren Add-Type -Name Window -Namespace Console -MemberDefinition ' [DllImport("Kernel32.dll")] public static extern IntPtr GetConsoleWindow(); [DllImport("user32.dll")] public static extern bool ShowWindow(IntPtr hWnd, Int32 nCmdShow); ' $consolePtr = [Console.Window]::GetConsoleWindow() [Console.Window]::ShowWindow($consolePtr, 0) |
Dadurch ergibt sich allerdings der gleiche Nachteil wie bei „WindowStyle Hidden“ und das Konsolenfenster ist minimiert in der Taskleiste zu sehen. Allerdings sieht man das Fenster nicht kurz aufflackern!
Quelle für den Code: https://gist.github.com/matthewjberger/3daffe454159f86fad1268b8404574b2
PowerShell-Script ohne Fenster ausführen mit AutoHotKey
Mit Hilfe des „AutoIt“-Ersatzes „AutoHotKey“, auch oft AHK abgekürzt, einer einfach zu lernenden Scripting-Sprache, mit der man nicht nur einfache Arbeitsschritte automatisieren kann, ist es recht einfach möglich ein PowerShell-Script zu starten und mittels des Parameters „Hide“ das Fenster wirklich komplett in den Hintergrund verschwinden zu lassen. Ebenfalls taucht dann kein Icon in der Taskleiste auf! Die Ausführung ist in diesem Fall wirklich „silent“ und man sieht das PowerShell-Fenster lediglich im Task-Manager. Hiermit baut man sich also einen „Wrapper“ um das eigentliche PowerShell-Script herum.
Ein entsprechender Aufruf eines PowerShell-Scripts in AutoHotKey könnte dabei wie folgt aussehen:
1 |
Run, powershell.exe -File C:\NoWindow.ps1, , Hide |
Das AutoHotKey-Script kann man auch in eine EXE umwandeln, die der Endanwender dann öffnet ohne mitzubekommen, dass im Hintergrund ein PowerShell-Script geöffnet wird. Das AutoHotKey-Script oder die EXE kann dann beispielsweise auch in der Aufgabenplanung hinterlegt werden und man umgeht die aufgezeigten Nachteile mit „WindowStyle Hidden“.
Anstatt ein solches AutoHotKey-Script für jedes PowerShell-Script, das in der Aufgabenplanung laufen soll, anzulegen, kann man natürlich auch eine universellere Variante bauen, bei der man das auszuführende PowerShell-Script als Parameter übergibt.
PowerShell-Script ohne Fenster ausführen mit VBScript
Wer nicht über AutoHotKey verfügt und es auch nicht installieren will, kann stattdessen auch das gute alte VBScript nutzen um einen solchen Wrapper für das PowerShell-Script zu nutzen:1
1 |
CreateObject("Wscript.Shell").Run "powershell -File ""C:\NoWindows.ps1""",0,false |
PowerShell-Script ohne Fenster ausführen mit CMD?!
Da es mit der CMD das gleiche Problem mit dem aufblitzenden Fenster aus der Aufgabenplanung heraus gibt und es keine andere Möglichkeit gibt, außer dem „WindowStyle“-Parameter, kann man keine Batch-Datei als Wrapper verwenden um das PowerShell-Script ohne Fenster zu öffnen. Wer mit dem kurz sichtbaren PowerShell-Fenster leben kann, kann aber natürlich auch eine Batchdatei nuten.
PowerShell-Script ohne Fenster ausführen mit Hilfstools wie RunHidden
Einen universellen Ansatz, der gleich funktioniert wie die zuvor gezeigten Methoden mit AHK und VBScript, bieten kostenlose Hilfstools wie „RunHidden“. Hier nutzt man das Tool als „Wrapper“, der dann die PowerShell mit dem angegebenen PowerShell-Script im Hintergrund ausführt. Nach der Installation kann man RunHidden z. B. wie folgt verwenden:
1 |
RunHidden C:\NoWindow.ps1 |
Argumente können hier sogar wie gewohnt hinter dem Pfad zum PowerShell-Script angegeben werden. Der Ersteller bewirbt das Tool mit den folgenden Eigenschaften:
RunHidden startet (fast) jedes Skript oder jede Konsolenanwendung, wobei das Konsolenfenster zu 100 % unterdrückt wird.
Es führt PowerShell-Skripte (ps1-Erweiterung), Batch-Dateien (cmd- und bat-Erweiterungen) und Python-Skripte (py-Erweiterung) direkt über ihren jeweiligen Interpreter aus (PowerShell.exe, Cmd.exe und Python.exe). Es wird davon ausgegangen, dass sich diese Interpreter im Pfad befinden.
Alle anderen Skripttypen werden über Cmd.exe ausgeführt (das normalerweise automatisch den richtigen Interpreter ausführt). Dieser Ansatz ist nicht für alle Fälle geeignet. Wenn Sie einen Skripttyp haben, der direkt von seinem Interpreter behandelt werden soll, öffnen Sie bitte ein Problem und ich werde versuchen, ihn hinzuzufügen.
Offensichtlich ist dies für Skripte und Exes gedacht, die keine Konsoleneingabe benötigen und mehr tun, als nur eine Konsolenausgabe zu produzieren.
RunHidden durchläuft alle Befehlszeilenargumente und ist kompatibel mit Pfaden und Argumenten, die Leerzeichen enthalten. Für PowerShell-Skriptargumente ist es nicht notwendig, die nachgestellten Backslashes zu verdoppeln, aber es ist in Ordnung, dies zu tun. Die folgenden Beispiele funktionieren beispielsweise alle korrekt:
RunHidden Script01.ps1 „C:\Some Folder“
RunHidden Script01.ps1 „C:\Irgendein Ordner\“
RunHidden Script01.ps1 „C:\Irgendein Ordner\“
RunHidden.exe ist komfortabler als entsprechende VBScript- oder JScript-Lösungen. Der Hauptvorteil ist, dass es einfacher mit Windows-Verknüpfungen zu verwenden ist.
RunHidden kann man hier kostenfrei herunterladen: https://lesferch.github.io/RunHidden/
PowerShell-Script ohne Fenster ausführen als Exe-Datei
Eine weitere Möglichkeit um ein PowerShell-Script ohne Fenster auszuführen, kann auch darin bestehen das PowerShell-Script selber in eine EXE-Datei umzuwandeln. Hierbei kann man konfigurieren, dass kein Konsolenfenster sichtbar sein soll. Einen Artikel zur Umwandlung von PowerShell-Scripten zu EXE-Dateien gibt es hier.
Fazit zum Ausführen eines PowerShell-Script ohne Fenster
Wie so oft wurde bei der Entwicklung nicht an vermutlich im Alltag nötige Optionen, wie das Ausführen eines PowerShell-Scripts ganz ohne Fenster gedacht. Insbesondere Administratoren werden so etwas aber für Systeme, an denen die Endanwender arbeiten, öfter brauchen und auch Hersteller von Branchensoftware, die bestimmte Anpassungen am System vornehmen müssen und dazu auf PowerShell-Scripte zurückgreifen, werden die Scripte eher komplett im Hintergrund ausführen lassen.
Den wohl sichersten Weg um das Fenster nicht nur zu minimieren, wie durch die Option „WindowStyle Hidden“, bieten dabei wohl die gezeigten Möglichkeiten einen Wrapper für das PowerShell-Script mittels eines Tools wie RunHidden oder durch eigene Scripte in AutoHotKey oder durch das betagte VBScript zu nutzen.