PowerShell的清除,历史不会清除历史记录(PowerShell's Clear-Hi

2019-08-02 09:26发布

最近,我还得跑,不幸的是要求我在命令行上输入密码正确的命令。

后来,我清屏“清除”,但也想清除命令历史记录,以便有问题的命令不会在会话历史记录中显示。 不幸的是, 清除,历史 cmdlet的似乎并没有真正做到其文档索赔什么-运行清除,历史似乎没有对任何会话历史记录中的任何影响。

我仍然可以看到在弹出菜单的历史以前的命令,然后按向上键在旧命令滚动。 这里有一个screengrab演示问题:

我已经验证了获取命令是清除的历史记录被确实执行预期的内置PowerShell命令。

我已经尝试了一些变化,如“清除历史记录-Count 10 -Newest”,都未能表现出任何效果。 当我指定一个确切的历史记录ID,如“清除历史记录-id 3”,我收到这样的错误:

Clear-History : Cannot locate history for Id 3.

即使我能看到的命令#3的屏幕上。

Answer 1:

为了补充CB的有用的答案。和JVimes的有用的答案 :

  • PowerShell的自己的历史机制( Get-HistoryClear-History )是独立于主机的 ,这就是为什么-多少有些出人意料- 你还需要单独清除主机的命令历史记录

  • 至于控制台宿主自身的历史特点

    • doskey风格的历史特征 ,前模块PSReadline附带的PowerShell(见下图):

      • 没有保存的历史 -历史保持仅在当前会话的持续时间。
      • Alt + F7必须用于清除控制台的历史 ,没有(明显)编程的方式来做到这一点(在cmd.exe控制台窗口中,你可以使用doskey /reinstall ,但是,这并不在PS工作)。
      • 。CB的回答显示了如何来模拟这种键盘组合; 记住:这个必须另外使用 Clear-History
    • PSReadline模块自带的PowerShell V5在Windows 10,也将与Windows Server 2016出货 ; 它取代了doskey具有更复杂的功能,风格的行编辑和命令历史功能 ; 还可以改造旧的Windows版本/ PS版本(> = V3)版本,它使用PowerShell的画廊 (PSv3和PSv4必须先安装PowerShellGet )。

      • 命令历史记录现在都保存在会话 ,文件
        (Get-PSReadlineOption).HistorySavePath
      • [Microsoft.PowerShell.PSConsoleReadLine]::ClearHistory()可以用来清除当前会话的历史记录 (注意,V1.2 +还支持Alt + F7对当前历史的互动结算。
        • 警告 :随着PSReadline的默认历史节约型风格, SaveIncrementally任何敏感的命令已经打电话给你保存的时候[Microsoft.PowerShell.PSConsoleReadLine]::ClearHistory() 并将在下次会议再次出现
        • 处理这种情况的唯一方法是删除保存的历史档案中 ,显示出JVimes的答案 ,然而, 总是抹了整个历史
        • 如果您设置您的个人资料调用Set-PSReadlineOption -HistorySaveStyle SaveAtExit每一个会话开始时间-设置本身apparenly没有“大棒” -你应该能够逃脱只调用[Microsoft.PowerShell.PSConsoleReadLine]::ClearHistory()Clear-History ),而无需将删除保存的历史文件,在这种情况下,你将不会从以前的会议失去了你保存的历史。 然而,随着1.2版本开始, SaveAtExit被完全损坏 -没有历史被保存在所有; 看到https://github.com/lzybkr/PSReadLine/issues/262

下面的高级功能捆绑的所有命令必须清除命令历史记录(无论是PowerShell的本身和控制台),既为doskey风格和PSReadline -模PowerShell控制台窗口:

注意:

  • 因为它是(目前)唯一安全的选择, PSReadline的保存的历史文件也被删除,这意味着整个历史,包括从以前的会议上被清除

  • 因此,确认提示默认显示。

<#
# .SYNOPSIS
#  Clears the command history, including the saved-to-file history, if applicable.
#>
function Clear-SavedHistory {
  [CmdletBinding(ConfirmImpact='High', SupportsShouldProcess)]
  param(    
  )

  # Debugging: For testing you can simulate not having PSReadline loaded with
  #            Remove-Module PSReadline -Force
  $havePSReadline = ($null -ne (Get-Module -EA SilentlyContinue PSReadline))

  Write-Verbose "PSReadline present: $havePSReadline"

  $target = if ($havePSReadline) { "entire command history, including from previous sessions" } else { "command history" } 

  if (-not $pscmdlet.ShouldProcess($target))
  {
        return
  }

  if ($havePSReadline) {

    Clear-Host

    # Remove PSReadline's saved-history file.
    if (Test-Path (Get-PSReadlineOption).HistorySavePath) { 
      # Abort, if the file for some reason cannot be removed.
      Remove-Item -EA Stop (Get-PSReadlineOption).HistorySavePath 
      # To be safe, we recreate the file (empty). 
      $null = New-Item -Type File -Path (Get-PSReadlineOption).HistorySavePath
    }

    # Clear PowerShell's own history 
    Clear-History

    # Clear PSReadline's *session* history.
    # General caveat (doesn't apply here, because we're removing the saved-history file):
    #   * By default (-HistorySaveStyle SaveIncrementally), if you use
    #    [Microsoft.PowerShell.PSConsoleReadLine]::ClearHistory(), any sensitive
    #    commands *have already been saved to the history*, so they'll *reappear in the next session*. 
    #   * Placing `Set-PSReadlineOption -HistorySaveStyle SaveAtExit` in your profile 
    #     SHOULD help that, but as of PSReadline v1.2, this option is BROKEN (saves nothing). 
    [Microsoft.PowerShell.PSConsoleReadLine]::ClearHistory()

  } else { # Without PSReadline, we only have a *session* history.

    Clear-Host

    # Clear the doskey library's buffer, used pre-PSReadline. 
    # !! Unfortunately, this requires sending key combination Alt+F7.
    # Thanks, https://stackoverflow.com/a/13257933/45375
    $null = [system.reflection.assembly]::loadwithpartialname("System.Windows.Forms")
    [System.Windows.Forms.SendKeys]::Sendwait('%{F7 2}')

    # Clear PowerShell's own history 
    Clear-History

  }

}


Answer 2:

在Windows 10,历史和敏感数据在未来的会议,即使Alt + F7,再次出现clear-history 。 在我找到的解决方案是:

Remove-Item (Get-PSReadlineOption).HistorySavePath

然后,结束当前会话或者通过清除CB的答案



Answer 3:

要清除屏幕上显示历史(F7),你必须按Alt + F7。

这历史是由控制台缓冲区,而不是由PowerShell的,有它的历史被清除的管理Clear-History cmdlet的。

脚本它,尝试:

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


文章来源: PowerShell's Clear-History doesn't clear history