Come cercare nella cronologia dei comandi Powershell dalle sessioni precedenti


16

Uso l'attuale Windows 10 con Powershell 5.1. Spesso, voglio cercare i comandi che ho usato in passato per modificarli e / o eseguirli nuovamente. Inevitabilmente, i comandi che sto cercando sono stati eseguiti in una finestra / sessione di PowerShell precedente o diversa.

Quando martello la chiave, posso sfogliare molti, molti comandi da molte, molte sessioni, ma quando provo a cercarli usando Get-History | Where-Object {$_.CommandLine -Like "*docker cp*"}, non ottengo risultati. La risoluzione dei problemi di base rivela che Get-Historynon mostra nulla delle sessioni precedenti, come mostrato da:

C:\Users\Me> Get-History

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

Come posso cercare tra i comandi precedenti forniti dalla chiave usando Get-Historyo un altro Cmdlet?

Risposte:


23

La cronologia persistente che menzioni è fornita da PSReadLine . È separato dal limite di sessione Get-History.

La cronologia è memorizzata in un file definito dalla proprietà (Get-PSReadlineOption).HistorySavePath. Visualizza questo file con Get-Content (Get-PSReadlineOption).HistorySavePath, o un editor di testo, ecc. Controlla le opzioni correlate con Get-PSReadlineOption. PSReadLine esegue anche ricerche cronologiche tramite ctrl+ r.

Utilizzando l'esempio fornito:

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


3

Risposta breve:

  • Premi Ctrl+ Re quindi inizia a digitare, per cercare interattivamente nella cronologia all'indietro . Questo corrisponde al testo da qualsiasi punto della riga di comando. Premi di nuovo Ctrl+ Rper trovare la prossima partita.
  • Ctrl+ Sfunziona come sopra, ma cerca avanti nella storia. Puoi usare Ctrl+ R/ Ctrl+ Sper andare avanti e indietro nei risultati di ricerca.
  • Digita un testo e premi F8. Questo cerca l'elemento precedente nella cronologia che inizia con l'input corrente.
  • Shift+ F8funziona come F8, ma cerca in avanti.

Risposta lunga:

Come menzionato da @jscott nella sua risposta, PowerShell 5.1 o versioni successive in Windows 10, utilizza il PSReadLinemodulo per supportare l'ambiente di modifica dei comandi. Il mapping completo dei tasti di questo modulo può essere recuperato utilizzando il Get-PSReadLineKeyHandlercmdlet. Per visualizzare tutti i mapping dei tasti relativi alla cronologia, utilizzare il comando seguente:

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

ed ecco l'output:

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

1
Super utile! Si noti che più Ctrl+Rpressioni scorreranno tra i risultati.
Ohad Schneider,

1

Ho questo nel mio profilo PS:

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

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.