Cómo buscar el historial de comandos de Powershell de sesiones anteriores

16

Yo uso Windows 10 actual con Powershell 5.1. A menudo, quiero buscar comandos que he usado en el pasado para modificarlos y / o volverlos a ejecutar. Inevitablemente, los comandos que estoy buscando se ejecutaron en una ventana / sesión de PowerShell anterior o diferente.

Cuando golpeo la tecla, puedo navegar a través de muchos, muchos comandos de muchas, muchas sesiones, pero cuando trato de buscarlos usando Get-History | Where-Object {$_.CommandLine -Like "*docker cp*"}, no obtengo resultados. La solución básica de problemas revela que Get-Historyno muestra nada de sesiones anteriores, como lo muestra:

C:\Users\Me> Get-History

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

¿Cómo puedo buscar a través de los comandos anteriores que la clave proporciona usando Get-Historyu otro Cmdlet?

shawmanz32na
fuente

Respuestas:

23

El historial persistente que menciona es proporcionado por PSReadLine . Está separado del límite de la sesión Get-History.

El historial se almacena en un archivo definido por la propiedad (Get-PSReadlineOption).HistorySavePath. Vea este archivo con Get-Content (Get-PSReadlineOption).HistorySavePath, o un editor de texto, etc. Inspeccione las opciones relacionadas con Get-PSReadlineOption. PSReadLine también realiza búsquedas de historial a través de ctrl+ r.

Usando su ejemplo proporcionado:

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

jscott
fuente
3

Respuesta corta:

  • Presione Ctrl+ Ry luego comience a escribir, para buscar hacia atrás en el historial de forma interactiva. Esto coincide con el texto desde cualquier lugar de la línea de comando. Presione Ctrl+ Rnuevamente para buscar la siguiente coincidencia.
  • Ctrl+ Sfunciona como arriba, pero busca en el historial. Puede usar Ctrl+ R/ Ctrl+ Spara ir y venir en los resultados de búsqueda.
  • Escriba un texto y luego presione F8. Esto busca el elemento anterior en el historial que comienza con la entrada actual.
  • Shift+ F8funciona como F8, pero busca hacia adelante.

Respuesta larga:

Como @jscott mencionó en su respuesta, PowerShell 5.1 o superior en Windows 10, utiliza el PSReadLinemódulo para admitir el entorno de edición de comandos. La asignación de teclas completa de este módulo se puede recuperar mediante el uso de Get-PSReadLineKeyHandlercmdlet. Para ver todas las asignaciones de teclas relacionadas con el historial, use el siguiente comando:

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

y aquí está la salida:

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
fuente
1
Super útil! Tenga en cuenta que varias Ctrl+Rpulsaciones recorrerán los resultados.
Ohad Schneider
1

Tengo esto en mi perfil de 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
fuente