Como pesquisar o histórico de comandos do Powershell de sessões anteriores

16

Eu uso o Windows 10 atual com o Powershell 5.1. Muitas vezes, quero procurar comandos que usei no passado para modificá-los e / ou executá-los novamente. Inevitavelmente, os comandos que estou procurando foram executados em uma janela / sessão anterior ou diferente do PowerShell.

Quando pressiono a tecla, posso navegar por muitos, muitos comandos de muitas, muitas sessões, mas quando tento pesquisá-las usando Get-History | Where-Object {$_.CommandLine -Like "*docker cp*"}, não obtenho resultados. A solução de problemas básica revela que Get-Historynão mostra nada das sessões anteriores, como mostra:

C:\Users\Me> Get-History

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

Como pesquisar nos comandos anteriores que a chave fornece usando Get-Historyou outro Cmdlet?

shawmanz32na
fonte

Respostas:

23

O histórico persistente que você menciona é fornecido pelo PSReadLine . É separado do limite da sessão Get-History.

A história é armazenado em um arquivo definido pela propriedade (Get-PSReadlineOption).HistorySavePath. Visualize este arquivo com Get-Content (Get-PSReadlineOption).HistorySavePath, ou um editor de texto, etc. Inspecione as opções relacionadas com Get-PSReadlineOption. O PSReadLine também realiza buscas no histórico via ctrl+ r.

Usando seu exemplo fornecido:

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

jscott
fonte
3

Resposta curta:

  • Pressione Ctrl+ Re comece a digitar, para pesquisar no histórico de forma interativa. Isso corresponde ao texto de qualquer lugar na linha de comando. Pressione Ctrl+ Rnovamente para encontrar a próxima partida.
  • Ctrl+ Sfunciona como acima, mas pesquisa no histórico. Você pode usar Ctrl+ R/ Ctrl+ Spara ir e voltar nos resultados da pesquisa.
  • Digite um texto e pressione F8. Ele procura o item anterior no histórico que começa com a entrada atual.
  • Shift+ F8funciona como F8, mas procura adiante.

Resposta longa:

Como o @jscott mencionado em sua resposta, o PowerShell 5.1 ou superior no Windows 10, usa o PSReadLinemódulo para oferecer suporte ao ambiente de edição de comandos. O mapeamento de chave completo deste módulo pode ser recuperado usando o Get-PSReadLineKeyHandlercmdlet. Para visualizar todos os mapeamentos de chaves relacionados ao histórico, use o seguinte comando:

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

e aqui está a saída:

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
fonte
1
Super útil! Observe que várias Ctrl+Rimpressoras irão percorrer os resultados.
Ohad Schneider
1

Eu tenho isso no meu perfil 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
fonte