Befehle wiederholen in PowerShell


    Tags:

    Cmdlets des Moduls PSReadLinePowerShell hält die Befehls­historie in der Version 5.x dank PSReadLine gleich doppelt vor, einmal nur für die Session und das andere Mal per­manent in einer Datei. Möchte man Kom­mandos aus der sitzungs­über­greifenden Liste aus­wä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.

    Eine einfache Möglichkeit zur Navigation in der Befehlsliste bietet die klassische PowerShell-Historie über die F7-Taste.

    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.

    Anzeigen der Befehlshistorie von PSReadLine mit Out-GridView

    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.

    Wiederholen von Befehlen anhand ihrer Zeilennummer

    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ärts­suche mit STRG + s bzw. STRG +r.

    Keine Kommentare