Tags: PowerShell
PowerShell hält die Befehlshistorie in der Version 5.x dank PSReadLine gleich doppelt vor, einmal nur für die Session und das andere Mal permanent in einer Datei. Möchte man Kommandos aus der sitzungsübergreifenden Liste auswählen und gleich starten, dann bietet sich eine Lösung mit Out-GridView an.
Startet man eine frische PowerShell-Sitzung und betätigt die Pfeiltasten nach oben und unten, dann bewegt man sich damit durch die Befehle früherer Sessions. Gibt man jedoch den Befehl Get-History ein, dann ist das Ergebnis leer.
PSReadLine überdeckt herkömmliche Historie
Der Grund für dieses Verhalten liegt darin, dass PSReadLine die Tasten für das Abrufen früherer Befehle steuert und diese aus einer Datei entnimmt, welche die Kommandos sitzungsübergreifend speichert (siehe dazu: Kommandozeile und Befehlshistorie in PowerShell bearbeiten mit PSReadline). Die klassische PowerShell-Historie tritt dadurch in den Hintergrund.
Die Dominanz des Moduls PSReadLine hat unter anderem zur Folge, dass man sich unter PowerShell 5.x die Liste der bisherigen Befehle nicht mehr über F7 anzeigen lassen kann. PSReadLine bietet dafür jedoch keinen adäquaten Ersatz.
Befehle mit Out-GridView anzeigen
Man kann sich aber durch eine kleine function behelfen, welche den Inhalt der Textdatei ausliest, in der PSReadLine die Befehle speichert. Ihren Speicherort ermittelt man mit
(Get-PSReadlineOption).HistorySavePath
Wenn diese Datei existiert, dann muss man sie nur mehr einlesen und durch Out-GridView schicken. Den Befehl, den der User dort auswählt, übergibt man dann an Invoke-Expression. Die Funktion könnte dann so aussehen.
Sie enthält zusätzlich einen Filter mit Hilfe von Select-String, so dass man die Liste der Befehle anhand eines Suchbegriffs eingrenzen kann. So würde
rc Get-
alle Kommandos anzeigen, in denen Cmdlets oder Funktionen vorkommen, deren Name mit "Get-" beginnt.
Befehl über Zeilennummer starten
Unter den Unix-Shells kann man einen Befehl wiederholen, indem man seine Nummer nach einem "!" eingibt, also zum Beispiel würde
!433
den 433. Befehl in der Historie starten.
Mit der klassischen Historie von PowerShell lässt sich dieses Verhalten einigermaßen nachbilden. Dazu zeigt man die Liste mit Hilfe von Get-History an und übergibt dann die ID an Invoke-History. Um die Tipparbeit abzukürzen, sollte man ein Alias nach diesem Muster definieren, hier im Beispiel für den Buchstaben 'l' (das ! ist belegt):
New-Alias -Name l -Value Invoke-History
Anschließend reicht ein
l 29
zur Wiederholung des 29. Befehls.
Nicht so einfach geht es, wenn man einen Befehl aus einer früheren Sitzung benötigt und dabei die Aufzeichnungen von PSReadline ausliest. Sie enthalten die bloßen Befehle ohne Zeilennummern. Letztere liefert in der folgenden function Select-String, das mit '$' nach dem Zeilenende sucht und so alle Einträge findet.
Nach der Ausgabe der Befehlsliste erwartet Read-Host die Eingabe der Zeilennummer, die man anschließend als Index für die Historie dient. Die so referenzierte Zeile übergibt man wieder an Invoke-Expression.
Beide hier vorgestellten Funktionen könnte man in das Profil übernehmen, so dass sie in jeder Session sofort zur Verfügung stehen.
Ansonsten besteht immer noch die Möglichkeit, sich mit den integrierten Mitteln von PSReadLine zu behelfen. Dazu gehören vor allem die Vorwärts- und Rückwärtssuche mit STRG + s bzw. STRG +r.
Täglich Know-how für IT-Pros mit unserem Newsletter
Verwandte Beiträge
Weitere Links