如何从以前的会话中搜索 Powershell 命令历史记录

如何从以前的会话中搜索 Powershell 命令历史记录

我使用最新的 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或其他 Cmdlet搜索该键提供的先前命令?

答案1

您提到的持久历史记录由读取行. 它与会话绑定是分开的Get-History

历史记录存储在由属性 定义的文件中(Get-PSReadlineOption).HistorySavePath。使用Get-Content (Get-PSReadlineOption).HistorySavePath或文本编辑器等查看此文件Get-PSReadlineOption。使用 检查相关选项。PSReadLine 还通过ctrl+执行历史记录搜索r

使用您提供的示例:

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

答案2

  • Ctrl+R然后开始输入,向后搜索在历史记录中交互。这将匹配命令行中任意位置的文本。再次按Ctrl+R查找下一个匹配项。
  • Ctrl+S工作原理与上述相同,但是向前搜索在历史记录中。您可以使用Ctrl+ R/ Ctrl+S在搜索结果中来回切换。
  • 输入文本然后按F8。这将在历史记录中搜索以当前输入开头的上一个项目。
  • Shift+F8工作方式类似F8,但向前搜索。

更多信息

正如 @jscott 在其回答中提到的,Windows 10 中的 PowerShell 5.1 或更高版本使用该PSReadLine模块来支持命令编辑环境。可以使用Get-PSReadLineKeyHandlercmdlet 检索此模块的完整键映射。要查看与历史记录相关的所有键映射,请使用以下命令:

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

答案3

我的 PS 个人资料中有这个:

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

答案4

function Search-History {
   Param(
       [Parameter(Position = 0, Mandatory = $true)]
       [string]$Pattern
   )

   $historyFilePath = (Get-PSReadlineOption).HistorySavePath
   Get-Content -Path $historyFilePath | Select-String -Pattern $Pattern
}

我使用这个函数并将其添加到 $PROFILE。例如使用它 Search-History .*

相关内容