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 на экране.
Ответы
Ответ 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
}
}