F7 在 Powershell 7 中不能显示命令历史记录吗?

F7 在 Powershell 7 中不能显示命令历史记录吗?

在 Powershell 5.1 中,可以按下F7,然后会显示以前输入的命令的历史记录。我刚刚安装了 Powershell 7.2,F7现在什么都做不了了。F8不过仍然会根据命令历史记录自动完成。

答案1

F7在 PowerShell 7 中不再执行任何操作。

默认情况下它不执行任何操作。但是请继续阅读...

Get-PSReadLineKeyHandler列出了所有可用的键盘快捷键,并且从 PowerShell 7 开始F7不再包含在历史功能列表中:

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

about 输出来自Get-PSReadLineKeyHandler在 PowerShell 7.2.2 上运行

说来也怪F7 仍然列在 Microsoft 文档中关于历史记录- PowerShell | Microsoft Docs所以应该工作。


情节愈发复杂

它仍然有效,只是不能与 PSReadLine模块结合使用 (1) . 我不确定这是否有记录在案,但你可以运行以下命令:

Remove-Module -Name PSReadLine

使用这个 cmdlet 之后,您将能够F7再次尽情享受,但您将错过所有奇特的颜色;)

请注意,这Remove-Module实际上并没有删除模块,它只是从当前会话中卸载它。

(1)强调矿井

来源Windows 10 AU 中 F7 历史记录不再存在?:PowerShell

有一个开放的错误报告请允许 F7 工作 · 问题 #620 · PowerShell/PSReadLine


解决方法

您可以使用以下脚本。

F7您可以使用 Set-PSReadlineKeyHandler脚本中的 cmdlet在 PSReadline 中添加自己的内容。例如:

Set-PSReadlineKeyHandler -Key F7 -BriefDescription "History" -LongDescription "Show command history" -ScriptBlock {
  $pattern = $null
  [Microsoft.PowerShell.PSConsoleReadLine]::GetBufferState([ref] $pattern, [ref] $null)
  if ( $pattern ) {
    $pattern = [Regex]::Escape($pattern)
  }
  $history = [System.Collections.ArrayList] @(
    $last = ""
    $lines = ""
    foreach ( $line in [System.IO.File]::ReadLines((Get-PSReadlineOption).HistorySavePath) )
      {
      if ( $line.EndsWith('`') ) {
        $line = $line.Substring(0, $line.Length - 1)
        $lines = if ( $lines ) { "$lines`n$line" } else { $line }
        continue
      }
      if ( $lines ) {
        $line = "$lines`n$line"
        $lines = ""
      }
      if ( ($line -cne $last) -and ((-not $pattern) -or ($line -match $pattern)) ) {
        $last = $line
        $line
      }
    }
  )
  $command = $history | Out-GridView -Title History -PassThru
  if ( $command ) {
    [Microsoft.PowerShell.PSConsoleReadLine]::RevertLine()
    [Microsoft.PowerShell.PSConsoleReadLine]::Insert(($command -join "`n"))
  }
}

当您使用此功能时,F7密钥将出现在弹出的网格视图窗口中。选择一个历史记录条目并按 Enter,PowerShell 会将其放在命令行上进行编辑。

来源在 Windows 10 Powershell 中通过 F7 使命令历史记录弹出窗口工作 - VoidCC,回答者比尔·斯图尔特

也可以看看在 Powershell 中使用 F7 作为“显示命令历史记录”以获得类似的解决方法。

答案2

我开发了“F7 History”PowerShell 模块来解决这个问题:

F7History从安装PowerShell 库

Install-Module -Name "F7History"

F7History在 PowerShell 中添加一行以导入$profile

Import-Module -Name "F7History"

在 PowerShell 命令行中:

  • 按下F7即可查看当前 PowerShell 实例的历史记录。
  • 按下Shift-F7即可查看所有 PowerShell 实例的历史记录。

F7在点击或之前在命令行上输入的任何内容都Shift-F7将用于Out-ConsoleGridView“-Filter”参数。

Command Line History窗口显示时:

  • 使用箭头键或鼠标选择一个项目。
  • 用于ENTER在命令行中插入选定的项目。
  • 用于ESC关闭窗口而不在命令行中插入任何内容。

相关内容