====== 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.\\ {{:powershell:module:get-history.png?400|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 '' 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 '' räumt die x ältesten Befehle ab. Praktisch ist die Option ''-CommandLine '', 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.