Подтвердить что ты не робот

PowerShell Clear-History не очищает историю

Недавно мне пришлось запустить команду, которая, к сожалению, потребовала от меня ввода пароля прямо в командной строке.

После этого я очистил свой экран с помощью "Очистить", но также хотел очистить историю команд, чтобы нарушающая команда не отображалась в истории сеансов. К сожалению, командлет Clear-History, похоже, на самом деле не выполняет то, о чем говорится в его документации - запуск Clear-History, похоже, никак не влияет на историю сеансов.

Я все еще могу видеть предыдущие команды во всплывающем меню истории и пролистывать старые команды, нажимая клавишу "вверх". Вот скриншот, демонстрирующий проблему:

PowerShell clear history failure

С помощью Get-Command я подтвердил, что Clear-History действительно выполняет ожидаемый встроенный командлет PowerShell.

Я пробовал несколько вариантов, таких как "Очистить историю -count 10 -newest", но все они не показали никакого эффекта. Когда я указываю точный идентификатор истории, такой как "Очистить историю -id 3", я получаю ошибку, подобную этой:

Clear-History : Cannot locate history for Id 3.

Даже если я вижу команду № 3 на экране.

4b9b3361

Ответ 1

Чтобы очистить историю отображения на экране (F7), нужно нажать Alt + F7.

Эта история управляется консольным буфером, а не PowerShell, чья история может быть очищена командлетом Clear-History.

Чтобы написать это, попробуйте:

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

Ответ 2

В Windows 10 история и конфиденциальные данные появляются снова в будущих сеансах даже после Alt + F7 и clear-history. Решение которое я нашел, было:

Remove-Item (Get-PSReadlineOption).HistorySavePath

Затем завершите текущий сеанс или очистите его через ответ CB

Ответ 3

В дополнение к CB. полезный ответ и полезный ответ JVimes:

  • Механизм собственной истории PowerShell (Get-History, Clear-History) не зависит от хоста, поэтому - несколько неожиданно - вам также нужно очистить историю команд хостов отдельно.

  • Что касается встроенной функции истории хоста :

    • doskey - история создания, перед тем как модуль PSReadline отправлен с PowerShell (см. ниже):

      • нет сохраненной истории. История сохраняется только в течение текущего сеанса.
      • Alt+F7 должен использоваться для очистки истории консоли, без (очевидного) программного способа сделать это (в окне консоли cmd.exe вы можете использовать doskey /reinstall, но это doesn работайте в PS).
      • CB. answer показывает, как имитировать эту комбинацию клавиш; помните: это необходимо использовать в дополнение к Clear-History.
    • Модуль PSReadline поставляется с PowerShell v5 в Windows 10 и также будет поставляться с Windows Server 2016; он заменяет функции doskey -style line-editing и command-history с более сложными функциями; также возможно модифицировать старые версии Windows/версии PS ( >= v3) с помощью Галерея PowerShell (сначала должны быть PSv3 и PSv4 установите PowerShellGet).

      • Команда история теперь сохраняется в сеансах, в файле
        (Get-PSReadlineOption).HistorySavePath.
      • [Microsoft.PowerShell.PSConsoleReadLine]::ClearHistory() может использоваться для очистки текущей истории сеансов (обратите внимание, что v1.2 + также поддерживает Alt+F7 для интерактивной очистки текущей истории.
        • CAVEAT. С PSReadline стилем сохранения истории по умолчанию SaveIncrementally, любые конфиденциальные команды уже были сохранены к тому времени, когда вы вызовете [Microsoft.PowerShell.PSConsoleReadLine]::ClearHistory(), и снова появится в следующем сеансе.
        • Единственный способ справиться с этим - удалить файл сохраненной истории, как показано в JVimes answer, который, однако, неизменно стирает всю историю.
        • IF вы настраиваете свой профиль для вызова Set-PSReadlineOption -HistorySaveStyle SaveAtExit каждый раз, когда начинается сеанс - настройка, по-видимому, НЕ "прилипает" сама по себе - вы должны уйти с вызовом только [Microsoft.PowerShell.PSConsoleReadLine]::ClearHistory() (в дополнение к Clear-History) без необходимости удаления файла сохраненной истории, и в этом случае вы не потеряете сохраненную историю из предыдущих сеансов. ОДНАКО, AS v1.2, SaveAtExit - BROKEN ALTOGETHER - история не сохраняется вообще; см. https://github.com/lzybkr/PSReadLine/issues/262

Следующая расширенная функция объединяет все команды, необходимые для очистки истории команд (как для самой PowerShell, так и для консоли), как для doskey -style, так и для PSReadline -module окон консоли 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 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 own history 
    Clear-History

    # Clear PSReadline *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 buffer, used pre-PSReadline. 
    # !! Unfortunately, this requires sending key combination Alt+F7.
    # Thanks, /info/306987/powershell-clear-history-doesnt-clear-history/1497691#1497691
    $null = [system.reflection.assembly]::loadwithpartialname("System.Windows.Forms")
    [System.Windows.Forms.SendKeys]::Sendwait('%{F7 2}')

    # Clear PowerShell own history 
    Clear-History

  }

}