PowerShell Clear-History不会清除历史记录

时间:2012-11-06 19:13:54

标签: powershell history

最近我不得不运行一个命令,不幸的是我要求我在命令行上输入密码。

之后,我用“清除”清除了我的屏幕,但也希望清除命令历史记录,以便在会话历史记录中不会显示违规命令。遗憾的是,Clear-History cmdlet似乎并没有实际执行其文档所声称的内容 - 运行Clear-History似乎对会话历史记录没有任何影响。

我仍然可以在弹出的历史记录菜单中看到以前的命令,并按向上键滚动查看旧命令。这是一个证明问题的屏幕抓图:

PowerShell clear history failure

我已经使用Get-Command验证了Clear-History确实正在执行预期的内置PowerShell cmdlet。

我尝试了一些变体,例如“Clear-History -count 10 -newest”,都未能显示任何效果。当我指定确切的历史ID时,例如“Clear-History -id 3”,我收到如下错误:

Clear-History : Cannot locate history for Id 3.

即使我可以在屏幕上看到命令#3。

4 个答案:

答案 0 :(得分:52)

在Windows 10 上,即使在Alt + F7和clear-history之后,历史记录和敏感数据也会在将来的会话中再次显示。 solution I found是:

Remove-Item (Get-PSReadlineOption).HistorySavePath

然后,结束当前会话或通过CB's answer

清除它

答案 1 :(得分:31)

要清除屏幕显示历史记录( F7 ),您必须按 Alt + F7

此历史记录由控制台缓冲区管理,而不是由Clear-History cmdlet可以清除其历史记录的PowerShell管理。

要编写脚本,请尝试:

[System.Reflection.Assembly]::LoadWithPartialName("System.Windows.Forms")
[System.Windows.Forms.SendKeys]::Sendwait('%{F7 2}')

答案 2 :(得分:18)

补充CB.'s helpful answerJVimes's helpful answer

  • PowerShell自己的历史记录机制(Get-HistoryClear-History)是独立于主机的 ,这就是为什么 - 有点出乎意料 - < strong>您还需要单独清除主机的命令历史记录

  • 至于控制台主机自己的历史记录功能

      在PowerShell随附的模块doskey之前
    • PSReadline - 样式历史记录功能 :(见下文):

      • 没有已保存历史记录 - 仅在当前会话期间保留历史记录。
      • Alt + F7 必须用于清除控制台的历史记录,没有(明显的)编程方式(在cmd.exe控制台窗口中你可以使用doskey /reinstall,但这在PS中不起作用。
      • CB.'s answer向您展示如何模拟此键盘组合;请记住:这必须在 {/ 1>}的添加中使用。
    • PSReadline模块随Windows 10上的PowerShell v5一起提供,并将随Windows Server 2016一起提供; 用更复杂的功能替换Clear-History式的行编辑和命令历史功能;也可以使用PowerShell Gallery(PSv3和PSv4必须首先安装PowerShellGet)来使用它来改进旧的Windows版本/ PS版本(&gt; = v3)版本。

      • 命令历史记录现在保存在会话 ,在文件
        中 的 doskey 即可。
      • (Get-PSReadlineOption).HistorySavePath可用于清除当前会话的历史记录(请注意,v1.2 +还支持 Alt + F7 用于交互式清除当前历史记录。
        • CAVEAT :使用[Microsoft.PowerShell.PSConsoleReadLine]::ClearHistory()的默认历史记录保存样式PSReadline任何敏感命令已保存您拨打SaveIncrementally将重新出现在下一个会话中。
        • 处理此问题的唯一方法是删除已保存的历史记录文件,如JVimes's answer中所示,但总是会消除整个历史记录
        • 如果您将自己的个人资料设置为每次会话开始时调用[Microsoft.PowerShell.PSConsoleReadLine]::ClearHistory() - 该设置本身并非“坚持” - 您应该只需拨打Set-PSReadlineOption -HistorySaveStyle SaveAtExit(除了[Microsoft.PowerShell.PSConsoleReadLine]::ClearHistory())而无需删除已保存的历史记录文件,就可以逃脱,在这种情况下,您不会丢失以前会话中保存的历史记录。 然而,在v1.2中,Clear-History已经破坏了 - 根本没有保存历史记录;见https://github.com/lzybkr/PSReadLine/issues/262

以下高级功能捆绑了清除命令历史记录所需的所有命令(PowerShell本身和控制台),SaveAtExit - 样式和doskey - 模块PowerShell控制台窗口:

注意:

  • 因为它(当前)是唯一安全的选项,PSReadline的已保存历史文件也会被删除,这意味着整个历史记录,包括以前的会话,已被清除

  • 因此,默认情况下会显示确认提示。

PSReadline

答案 3 :(得分:2)

获取 PowerShell 命令历史文件位置:

PS C:\> (Get-PSReadlineOption).HistorySavePath

显示 PowerShell 命令历史文件的内容:

PS C:\> cat (Get-PSReadlineOption).HistorySavePath

通过删除历史文件来清除 PowerShell 中的命令历史:

PS C:\> Remove-Item (Get-PSReadlineOption).HistorySavePath