Die PowerShell Konsole öffnet sich für einen kurzen Augenblick, es huschen rote Fehlermeldungen über den Bildschirm. Doch bevor man diese erkennen kann, ist das Fenster schon wieder verschwunden. Häufig liegt dies an Leerzeichen im Pfad. In diesem Beitrag möchte ich zeigen, wie man das Problem lösen kann und PowerShell trotz Leerzeichen verwenden.
Dieser Artikel ist Teil der Serie Lean und Standardsoftware. Es geht um den besseren Einsatz von vorhandener Software in einer typischen Büro-/Produktionsumgebung. Heute nochmals: PowerShell. Der ein oder andere wird sich Fragen, was das alles mit Lean zu tun hat? Bei Lean geht es doch viel um die Menschen und nicht so sehr um die Techniken? Das ist vollkommen richtig und ich sehe das genauso. Leider findet man zu der technischen Umsetzung von schlanken Lösungen in Unternehmen im Internet recht wenig, daher diese Serie. Die Technik soll einfach sein, damit man sich um das Wesentliche kümmern kann. Doch nun zurück zur PowerShell:
Das Problem: Leerzeichen im Pfad
In der ISE(Integrated Scripting Environment) lässt sich das folgende Skript ohne Probleme ausführen, will man das selbe Skript per Doppelklick starten klappt es nicht:
Häufige Ursache dafür sind Leerzeichen im Pfad, bzw. im Skriptnamen.
Der Pfad: C:\Test\Skript_ohne_Leerzeichen.ps1
lässt sich auch per Doppelklick ausführen.
Bei: C:\Test\Skript mit Leerzeichen.ps1
oder C:\Ordner mit Leerzeichen\Skript.ps1
gibt es Fehlermeldungen.
Sind keine Leerzeichen im Pfad, und es läuft trotzdem nicht? Dann helfen vielleicht diese Tipps um PowerShell zum Laufen zu bringen. Die Leerzeichenproblematik scheint ein Bug zu sein. Hier drei Methoden um das Problem zu lösen bzw. zum umgehen.
1. Lösung: Leerzeichen entfernen
Klingt trivial ist aber oft eine einfache und schnelle Methode. Ersetzen Sie alle Leerzeichen im Pfad durch ein anderes Zeichen, zum Beispiel den Unter- bzw. Bindestricht(_ oder -).
Also wird C:\Ordner mit Leerzeichen\Skript mit Leerzeichen.ps1
umbenannt zu C:\Ordner_mit_Leerzeichen\Skript-mit-Leerzeichen.ps1
2. Lösung: Registry Eintrag ändern
Wie erwähnt liegt das Problem an einem fehlerhaften Registry Eintrag. Durch bearbeiten der Registry lässt sich dies beheben (Danke an Daniel Schroeder für die Anleitung). Achtung: Dazu benötigen Sie Administrator-Rechte.
Öffnen Sie den Registry Editor: Windows-Taste + R drücken (Das Ausführen Fenster erscheint), regedit
eingeben und OK klicken:
Navigieren Sie im Registry Editor zu: HKEY_CLASSES_ROOT\Applications\powershell.exe\shell\open\command
Der Wert muss von: "C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe" "%1"
Geändert werden zu: "C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe" "& \"%1\""
Vorteil dieser Methode: Es muss nur einmal gemacht werden und alle Skripte laufen. Man muss nicht jedes mal daran denken.
Nachteil: Muss auf jedem PC gemacht werden, auf dem die Skripte laufen sollen. Hat man keine Administrator Rechte lässt sich die Registry nicht ändern.
3. Lösung: Wrapper Scripts als .ps1 oder .bat
Die in der Verknüpfung eingegebenen Parameter lassen sich auch über ein Wrapper Skript starten. Das ist ein Skript um das eigentliche Skript zu starten. (Achtung. Das Wrapper Script darf natürlich keine Leerzeichen enthalten.)
Dieses Skript kann eine PowerShell oder auch Batch Datei sein. Besonders die Kommandozeile ist nicht so elegant, da man sich dann zusätzlich mit einer weiteren Syntax beschäftigen muss.
Meiner Meinung nach haben die Wrapper Skripts gegenüber den Verknüpfungen nur Nachteile, daher werden sie hier nicht ausführlich erwähnt. Wer mehr erfahren will, kann das in einem Thread im Microsoft TechNet nachlesen.
4. Lösung: Eine Verknüpfung (mit Parametern) anlegen. Mein Tipp.
Danke an Stefan Macke für die Hinweise. Diese Methode eignet sich vor allem für Skripte, die mit Parametern und Übergaben gesteuert werden können.
Man kann eine Verknüpfung auf das Skript anlegen, das hat mehrere Vorteile:
- Das Skript muss nicht umbenannt werden.
- Es können direkt Parameter mit übergeben werden.
- Der Verknüpfung kann ein Hilfetext bzw. eine Beschreibung hinzugefügt werden.
- Man benötigt keine Admin-Rechte.
Wird das Skript später umbenannt muss natürlich die Verknüpfung angepasst werden.
1. PowerShell Verknüpfung anlegen
Im Ordner, in dem die Verknüpfung angelegt werden soll macht man einen Rechtsklick: Neu >> Verknüpfung
Als Speicherort geben Sie den Pfad zu PowerShell.exe an:
%SystemRoot%\system32\WindowsPowerShell\v1.0\powershell.exe
Zum Schluss kann der Verknüpfung noch ein Name gegeben werden.
Mouseover Hinweise lassen sich über Rechtsklick >> Eigenschaften einfügen:
2. Das Ziel Feld. Mit Parametern und -NoExit
Das vorgestellte Muster lässt sich auf alle Skripte mit oder ohne Leerzeichen und mit oder ohne Parameter anwenden.
Machen Sie einen Rechtsklick auf die soeben angelegte Verknüpfung und wählen Sie Eigenschaften. Im Feld Ziel tragen Sie den Skriptaufruf ein. Ein Beispiel:
%SystemRoot%\system32\WindowsPowerShell\v1.0\powershell.exe -NoExit & '.\Skript mit Leerzeichen.ps1' -Alter 23 -Name 'Müller Mäxchen'
Schauen wir das Beispiel im Detail an.
%SystemRoot%\system32\WindowsPowerShell\v1.0\powershell.exe
ruft die PowerShell auf. -NoExit
hält das Fenster nach der Ausführung offen. Das kaufmännische Und &
ist der Operator um ein Skript aufzurufen. Alternativ kann auch ein Punkt .
verwendet werden.
Der Pfad zum Skript '.\Skript mit Leerzeichen.ps1'
folgt in Anführungszeichen mit vorangestelltem Punkt und Backslash. Alternativ der absolute Pfad ohne vorangestellten Punkt, z.B. 'C:\Temp\Skript_ohne_Leerzeichen.ps1'
Gefolgt wird der Skriptname von Paramtern. Zuerst der Parametername mit vorangestelltem Bindestrich – gefolgt von einem Leerzeichen und anschließend dem zu übergebenen Wert. Handelt es sich bei dem Wert um einen String mit Leerzeichen muss dieser auch in Anführungszeichen übergeben werden: -Alter 23 -Name 'Müller Mäxchen'
2.1 Absolute Verknüpfung zum Skript
Bedeutet, dass der komplette Pfad zum Skript angegeben wird. Das macht Sinn, wenn das Skript an einem ganz anderen Ort liegt, bzw. nichts mit der Verknüpfung zu tun haben.
Beispiel: Das Script liegt auf einem Serverlaufwerk und die Verlinkung auf dem Desktop (oder dort wo der Benutzer sie hingeschoben hat).
Eine relative Verknüpfung müsste nach jedem Verschieben angepasst werden, eine absolute nicht.
Ein Beispiel mit Parametern und dem -NoExit Flag:
%SystemRoot%\system32\WindowsPowerShell\v1.0\powershell.exe -NoExit ". 'C:\Temp\Skript_ohne_Leerzeichen.ps1' -Alter 23 -Name Müller"
2.2 Relative Verknüpfung zum Skript
Die Verknüpfung ist relativ zum Skript. D.h. wird ein Ordner im Pfad umbenannt, passiert nichts. Eine elegante Lösung, vor allem wenn Skript und Verlinkungen (z.B. mit unterschiedlichen Parametern) in einem Ordner liegen.
%SystemRoot%\system32\WindowsPowerShell\v1.0\powershell.exe -NoExit ". '.\..\Skript_ohne_Leerzeichen.ps1' -Alter 23 -Name Müller"
Interessant ist hier der Beginn mit den vielen Punkten. Die Verlinkung liegt in einem Unterordner und ruft das Skript im übergeordneten Ordner auf ('.\..\Skript_ohne_Leerzeichen.ps1'
). In den übergeordneten Ordner gelangt man durch die zwei Punkte ..
3. Das Ausführen in Feld in der Verknüpfung
Dieses Feld bestimmt den Startpfad, also das Verzeichnis in dem PowerShell startet. Wichtig wird dies für Skripte die relativ zu diesem Pfad arbeiten und z.B. Dateien in diesem Ordner verschieben, etc. Standardmäßig ist der Startpfad %HOMEDRIVE%%HOMEPATH% das entspricht: C:\User\<IhrBenutzername>
Die Standardeinstellung:
öffnet die PowerShell in Ihrem Benutzerverzeichnis:
3.1 Start im aktuellen Verzeichnis
Soll der Startpfad dem aktuellen Verzeichnis(in dem die Verlinkung liegt) entsprechen, löschen Sie den Text aus dem Feld Ausführen in:
PowerShell wird in dem Verzeichnis ausgeführt aus welchem aufgerufen wurde:
3.2 Absoluter Startpfad
Einen absoluten Pfad tragen Sie ganz einfach dort ein.
4. PowerShell Fenster offen halten mit -NoExit
Oft soll das Fenster nach Ende des Programms offen gehalten werden.
Nutzen Sie das –NoExit Flag in der Verknüpfung um ein PowerShell Fenster offen zu halten:
%SystemRoot%\system32\WindowsPowerShell\v1.0\powershell.exe -NoExit . 'C:\Temp\Skript mit Leerzeichen.ps1'
Alternativ können Sie das Skript auch mit einer Abfrage die auf eine Eingabe wartet offen gehalten werden: Read-Host "Hit <Enter> to close"
allerdings wird es dann schwierig, das Skript automatisiert einzusetzen. Es wird immer auf die Benutzereingabe gewartet. Daher ist –NoExit
wesentlich eleganter.
Fazit
Um das Problem zu lösen ist die Änderung der Registry am elegantesten. Weiterhin kann man Verknüpfungen ganz ohne Admin-Rechte nutzen um Parameter und Startverzeichnis zu übergeben.
P.S. Alle gezeigten Beispiele versehen sich ohne jegliche Garantie. Sie wenden die hier gezeigten Ideen auf eigenes Risiko(Datenverlust, etc.) an.
Der Artikel war hilfreich? Dann hinterlassen Sie bitte einen kurzen Kommentar.
Bildquelle: Pixabay