Jak przeszukiwać historię poleceń Powershell z poprzednich sesji

16

Używam obecnego systemu Windows 10 z Powershell 5.1. Często chcę wyszukać polecenia, których użyłem w przeszłości, do ich modyfikacji i / lub ponownego uruchomienia. Nieuchronnie polecenia, których szukam, zostały uruchomione w poprzednim lub innym oknie / sesji PowerShell.

Kiedy wbijam klawisz, mogę przeglądać wiele poleceń z wielu sesji, ale kiedy próbuję je przeszukiwać za pomocą Get-History | Where-Object {$_.CommandLine -Like "*docker cp*"}, nie otrzymuję żadnych wyników. Podstawowe rozwiązywanie problemów ujawnia, że Get-Historynie pokazuje niczego z poprzednich sesji, jak pokazują:

C:\Users\Me> Get-History

  Id CommandLine
  -- -----------
   1 Get-History | Where-Object {$_.CommandLine -Like "*docker cp*"}

Jak mogę przeszukiwać poprzednie polecenia, które udostępnia klawisz za pomocą Get-Historylub innego polecenia cmdlet?

shawmanz32na
źródło

Odpowiedzi:

23

Trwałą historię, o której wspominasz, zapewnia PSReadLine . Jest on niezależny od sesji Get-History.

Historia jest przechowywana w pliku zdefiniowanym przez właściwość (Get-PSReadlineOption).HistorySavePath. Wyświetl ten plik za pomocą Get-Content (Get-PSReadlineOption).HistorySavePathlub edytora tekstu itp. Sprawdź powiązane opcje za pomocą Get-PSReadlineOption. PSReadLine wykonuje również przeszukiwanie historii za pomocą ctrl+ r.

Korzystając z podanego przykładu:

Get-Content (Get-PSReadlineOption).HistorySavePath | ? { $_ -like '*docker cp*' }

jscott
źródło
3

Krótka odpowiedź:

  • Naciśnij Ctrl+, Ra następnie zacznij pisać, aby interaktywnie wyszukiwać wstecz w historii. Dopasowuje tekst z dowolnego miejsca w wierszu polecenia. Naciśnij Ctrl+ Rponownie, aby znaleźć następny mecz.
  • Ctrl+ Sdziała jak wyżej, ale wyszukiwania do przodu w historii. Możesz użyć Ctrl+ R/ Ctrl+, Saby przechodzić do przodu i do tyłu w wynikach wyszukiwania.
  • Wpisz tekst, a następnie naciśnij F8. Wyszukuje poprzedni element w historii, który zaczyna się od bieżących danych wejściowych.
  • Shift+ F8działa podobnie F8, ale wyszukuje do przodu.

Długa odpowiedź:

Jak wspomniano w swojej odpowiedzi @jscott, PowerShell 5.1 lub nowszy w Windows 10 używa PSReadLinemodułu do obsługi środowiska edycji poleceń. Pełne mapowanie kluczy tego modułu można odzyskać za pomocą polecenia Get-PSReadLineKeyHandlercmdlet. Aby wyświetlić wszystkie kluczowe mapowania związane z historią, użyj następującego polecenia:

Get-PSReadlineKeyHandler | ? {$_.function -like '*hist*'}

a oto wynik:

History functions
=================
Key       Function              Description
---       --------              -----------
Alt+F7    ClearHistory          Remove all items from the command line history (not PowerShell history)
Ctrl+s    ForwardSearchHistory  Search history forward interactively
F8        HistorySearchBackward Search for the previous item in the history that starts with the current input - like
                                PreviousHistory if the input is empty
Shift+F8  HistorySearchForward  Search for the next item in the history that starts with the current input - like
                                NextHistory if the input is empty
DownArrow NextHistory           Replace the input with the next item in the history
UpArrow   PreviousHistory       Replace the input with the previous item in the history
Ctrl+r    ReverseSearchHistory  Search history backwards interactively
Mohammad Dehghan
źródło
1
Super przydatne! Zauważ, że wiele Ctrl+Rnaciśnięć będzie cyklicznie przechodzić przez wyniki.
Ohad Schneider,
1

Mam to w moim profilu PS:

function hist { $find = $args; Write-Host "Finding in full history using {`$_ -like `"*$find*`"}"; Get-Content (Get-PSReadlineOption).HistorySavePath | ? {$_ -like "*$find*"} | Get-Unique | more }

Adam Wemlinger
źródło