Comment rechercher l'historique des commandes Powershell à partir des sessions précédentes

16

J'utilise Windows 10 actuel avec Powershell 5.1. Souvent, je veux rechercher des commandes que j'ai utilisées dans le passé pour les modifier et / ou les réexécuter. Inévitablement, les commandes que je recherche ont été exécutées dans une fenêtre / session PowerShell précédente ou différente.

Lorsque je martèle la clé, je peux parcourir de nombreuses commandes de nombreuses sessions, mais lorsque j'essaie de les parcourir à l'aide de Get-History | Where-Object {$_.CommandLine -Like "*docker cp*"}, je n'obtiens aucun résultat. Le dépannage de base révèle que Get-Historyrien ne s'affiche des sessions précédentes, comme le montre:

C:\Users\Me> Get-History

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

Comment rechercher parmi les commandes précédentes fournies par la clé Get-Historyou une autre applet de commande?

shawmanz32na
la source

Réponses:

23

L'historique persistant que vous mentionnez est fourni par PSReadLine . Il est distinct de celui lié à la session Get-History.

L'historique est stocké dans un fichier défini par la propriété (Get-PSReadlineOption).HistorySavePath. Affichez ce fichier avec Get-Content (Get-PSReadlineOption).HistorySavePath, ou un éditeur de texte, etc. Inspectez les options connexes avec Get-PSReadlineOption. PSReadLine effectue également des recherches d'historique via ctrl+ r.

En utilisant votre exemple fourni:

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

jscott
la source
3

Réponse courte:

  • Appuyez sur Ctrl+ Rpuis commencez à taper pour effectuer une recherche interactive dans l'historique. Cela correspond au texte de n'importe où dans la ligne de commande. Appuyez à nouveau sur Ctrl+ Rpour trouver la correspondance suivante.
  • Ctrl+ Sfonctionne comme ci-dessus, mais recherche dans l'historique. Vous pouvez utiliser Ctrl+ R/ Ctrl+ Spour faire des allers-retours dans les résultats de recherche.
  • Saisissez un texte, puis appuyez sur F8. Cela recherche l'élément précédent dans l'historique qui commence par l'entrée actuelle.
  • Shift+ F8fonctionne comme F8, mais recherche en avant.

Longue réponse:

Comme @jscott l'a mentionné dans sa réponse, PowerShell 5.1 ou supérieur dans Windows 10, utilise le PSReadLinemodule pour prendre en charge l'environnement d'édition des commandes. Le mappage complet des clés de ce module peut être récupéré à l'aide de la Get-PSReadLineKeyHandlercmdlet. Pour afficher tous les mappages de clés liés à l'historique, utilisez la commande suivante:

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

et voici la sortie:

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
la source
1
Super utile! Notez que plusieurs Ctrl+Rpressions feront défiler les résultats.
Ohad Schneider
1

J'ai ceci dans mon profil 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
la source