web-dev-qa-db-fra.com

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

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.

Quand je martèle le  , je peux parcourir de nombreuses commandes de nombreuses sessions, mais quand j'essaie de les parcourir en utilisant Get-History | Where-Object {$_.CommandLine -Like "*docker cp*"}, Je n'obtiens aucun résultat. Le dépannage de base révèle que Get-History ne montre rien 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 puis-je rechercher parmi les commandes précédentes que le  clé fournit à l'aide de Get-History ou une autre applet de commande?

14
shawmanz32na

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 associées 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*' }

22
jscott

Réponse courte:

  • Presse Ctrl+R puis commencez à taper, à recherche en arrière dans l'historique de manière interactive. Cela correspond au texte de n'importe où dans la ligne de commande. presse Ctrl+R à nouveau pour trouver le prochain match.
  • Ctrl+S fonctionne comme ci-dessus, mais recherche en avant dans l'historique. Vous pouvez utiliser Ctrl+R/Ctrl+S pour aller et venir 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+F8 fonctionne 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 module PSReadLine pour prendre en charge l'environnement d'édition de commandes. Le mappage complet des touches de ce module peut être récupéré en utilisant Get-PSReadLineKeyHandler applet de commande. 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
2
Mohammad Dehghan

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 }

1
Adam Wemlinger