Как искать историю команд Powershell из предыдущих сессий

16

Я использую текущую Windows 10 с Powershell 5.1. Часто я хочу посмотреть команды, которые я использовал в прошлом, чтобы изменить и / или повторно запустить их. Команды, которые я ищу, неизбежно выполнялись в предыдущем или другом окне / сеансе PowerShell.

Когда я нажимаю клавишу, я могу просмотреть много-много команд из многих-многих сессий, но когда я пытаюсь найти их с помощью Get-History | Where-Object {$_.CommandLine -Like "*docker cp*"}, я не получаю результатов. Основные неисправности показывают, что Get-Historyничего не видно из предыдущих сессий, как показано:

C:\Users\Me> Get-History

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

Как я могу выполнить поиск по предыдущим командам, которые предоставляет ключ с помощью Get-Historyили другого командлета?

shawmanz32na
источник

Ответы:

23

Упоминаемая вами постоянная история предоставляется PSReadLine . Он не связан с сеансом Get-History.

История хранится в файле, определяемом свойством (Get-PSReadlineOption).HistorySavePath. Просмотрите этот файл с Get-Content (Get-PSReadlineOption).HistorySavePathпомощью текстового редактора и т. Д. Проверьте связанные параметры с помощью Get-PSReadlineOption. PSReadLine также выполняет поиск в истории с помощью ctrl+ r.

Используя предоставленный вами пример:

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

jscott
источник
3

Короткий ответ:

  • Нажмите Ctrl+, Rа затем начните вводить текст для интерактивного поиска в истории. Это соответствует тексту в любом месте командной строки. Нажмите Ctrl+ еще Rраз, чтобы найти следующий матч.
  • Ctrl+ Sработает как выше, но ищет в истории. Вы можете использовать Ctrl+ R/ Ctrl+ Sдля перемещения вперед и назад в результатах поиска.
  • Введите текст и нажмите F8. Это ищет предыдущий элемент в истории, который начинается с текущего ввода.
  • Shift+ F8работает как F8, но ищет вперед.

Длинный ответ:

Как упомянул в своем ответе @jscott, PowerShell 5.1 или выше в Windows 10 использует PSReadLineмодуль для поддержки среды редактирования команд. Полное сопоставление клавиш этого модуля можно получить с помощью Get-PSReadLineKeyHandlerкомандлета. Чтобы просмотреть все сопоставления клавиш, связанные с историей, используйте следующую команду:

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

и вот вывод:

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
Супер полезно! Обратите внимание, что несколько Ctrl+Rнажатий будут циклически просматривать результаты.
Охад Шнайдер
1

У меня есть это в моем профиле PS:

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

Адам Вемлингер
источник