Get-History: PowerShell-Befehle wiederholen auf der Kommandozeile

    Wie jeder ordentliche Kommandointerpreter merkt sich auch PowerShell die während einer Sitzung eingegebenen Befehle, so dass man diese bei Bedarf zurückholen kann, ohne sie erneut eintippen zu müssen. Neben mehreren Funktionstasten helfen dabei einige Cmdlets, um die Befehlshistorie zu nutzen.

    Die einfachste Möglichkeit, bereits abgesetzte PowerShell-Befehle auf die Kommandozeile zurückzuholen, bieten wie bei cmd.exe die Cursor-Tasten. Allerdings wird die Suche auf diese Weise schnell mühselig, wenn man weiter zurück muss als zu den letzten 2 oder 3 Eingaben.

    Befehlshistorie filtern

    Man kann daher die Historie für die Navigation eingrenzen, indem man die ersten Zeichen eines bereits ausgeführten Kommandos eingibt und dann durch mehrfaches Drücken von F8 durch die gefilterte Liste iteriert. Obwohl PowerShell bei Befehlen nicht zwischen Groß- und Kleinschreibung unterscheidet, tut das aber die History-Funktion hinter der F8-Taste. Sie findet also nur Eingaben, wenn sie exakt mit den Zeichen beginnen, die man für die Suche eingegeben hat.

    Eine einfache Möglichkeit zur Navigation in der Befehlsliste bietet sich wie bei cmd.exe über die F7-Taste.

    Eine weitere Option, die Befehlshistorie zu durchlaufen, liegt wie bei cmd.exe hinter der F7-Taste. Ihre Ausgabe entspricht jener des Cmdlets Get-History, nur mit dem Unterschied, dass man sich mit den Pfeiltasten durch die Liste bewegen und von dort ein bestimmtes Kommando starten kann. Dagegen ist das Eingabefeld, das man durch Drücken von F9 erhält, nur dann von Nutzen, wenn man die ID des gesuchten Befehls kennt (was oft auch nichts hilft, weil die Zählweise nicht mit jener von Get-History übereinstimmt).

    Editieren des zuletzt ausgeführten Kommandos

    Einfache Editiermöglichkeiten für den zuletzt ausgeführten Befehl bieten F2 und F4. Erstere präsentiert ein Fenster mit der Anweisung Kopieren bis. Hier gibt man das Zeichen ein, bis zu dem der letzte Befehl übernommen werden soll. Wenn dieser zum Beispiel Get-Content -force \ProgramData lautet und man gibt '\' ein, dann kopiert diese Funktion Get-Content -force in die Eingabezeile. F4 ("Löschen bis Zeichen") dagegen würde ProgramData übernehmen, weil diese Funktion das Kommando bis zum ersten Auftreten des eingegebenen Zeichens löscht.

    Historie anzeigen und durchsuchen mit Cmdlets

    Eine weitergehende Bearbeitung der Befehlshistorie erlauben mehrere dafür zuständige Cmdlets. Get-History (alias history) zeigt die gesamte Liste von max. 64 Befehlen an, die PowerShell per Voreinstellung speichert. Mit dem Schalter -count kann man die Ausgabe auf die letzten x Befehle reduzieren, also zum Beispiel

    Get-History -count 20

    Kennt man die ID eines Kommandos, dann kann man es mit history - ID <id> anzeigen. In der Regel wird dies nicht der Fall sein, vielmehr wird man in der Historie nach einem bestimmten Befehl suchen. Dabei hilft das Cmdlet Select-String:

    Get-History | Select-String "WMI"

    zeigt alle ausgeführten Befehle an, die "WMI" enthalten. Möchte man die Befehlshistorie löschen, dann übernimmt Clear-History diese Aufgabe. Ohne Parameter entfernt es alle Einträge, der Schalter -count <x> räumt die x ältesten Befehle ab. Praktisch ist die Option -CommandLine <String>, die alle Kommandos tilgt, in denen die angegebene Zeichenfolge vorkommt.

    Keine persistente Speicherung der Befehle

    Im Gegensatz zu Unix-Shells wie die bash speichert PowerShell die Historie nicht dauerhaft, so dass nach dem Ende einer Sitzung alle dort eingegebenen Kommandos verloren gehen. Man kann sich dadurch behelfen, dass man die Ausgabe von Get-History in eine Datei schreibt und sie von dort später mit Add-History wieder in die Befehlshistorie übernimmt.

    Historie in CSV-Datei zwischenspeichern

    Allerdings reicht es nicht, wenn man zu diesem Zweck eine reine Textdatei verwendet. Vielmehr erwartet Add-History den Input in Form von HistoryInfo-Objekten, die man mit Get-History, Import-Clixml oder Import-Csv erzeugen kann. Daher muss man die History in einer CSV- oder XML-Datei ablegen, um sie nachher wieder importieren zu können:

    Get-History | Select -unique | Convertto-Csv > hist.csv

    Dieses Beispiel entfernt doppelte Einträge und schreibt die gesamte Historie in die Datei hist.csv. Aus dieser kann man sie dann später wiederherstellen:

    Get-Content hist.csv | ConvertFrom-Csv | Add-History

    Sind bereits Kommandos in der Historie vorhanden, dann hängt die obige Befehlszeile die Einträge aus der CSV-Datei am Ende der Liste an.

    2 Kommentare

    Bild von Andreas Dittfurth
    Andreas Dittfurth sagt:
    29. Juni 2013 - 14:12

    Kann man vom angegebenen Datum im Januar diesen Jahres darauf schließen, dass sich der Artikel auf die PowerShell 3.0 bezieht?

    Im Abschnitt "Historie anzeigen..." wird davon gesprochen, dass maximal 64 Befehle angezeigt werden. Das stimmt für PS 2.0, nicht aber für PS 3.0. Dort ist der Standardwert 4096. Da der Wert in der Variablen $MaximumHistoryCount gespeichert wurd, kann dies jeder Anwender für sich prüfen (oder eigene Werte zwischen 1 und 32767) vergeben.

    Bild von Christoph Schultz
    Christoph Schultz sagt:
    25. Juni 2017 - 14:14

    Die beste Möglichkeit vergangene Powershellbefehle auszuführen, ist:
    mit Get-History die Liste anzuzeigen danach mit 'Invoke-History -Id xx den Befehl auszuführen, da F7 nur die letzen 10 Behfehle enthält...
    LG