Tags: PowerShell, 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 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.
Täglich Know-how für IT-Pros mit unserem Newsletter
Verwandte Beiträge
- Pfad zu einer Programmdatei finden
- Windows Terminal 1.6 Preview erhält GUI für Einstellungen, v1.5 nun offizielles Release
- PowerShell 7.1 (als Store-App) verfügbar, Updates für PSReadLine, SecretManagement und PowerShellGet
- Fehler beim Ändern der Zeitzone in Windows Server 2019: Kommandozeile als Alternative
- Systemzeit remote auf der Kommandozeile oder mit PowerShell abfragen
Weitere Links
2 Kommentare
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.
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