Recently I had to run a command that unfortunately required me to type a password right on the command line.
Afterwards, I cleared my screen with \"Clear\", but also
To complement CB.'s helpful answer and JVimes's helpful answer:
PowerShell's own history mechanism (Get-History
, Clear-History
) is host-independent, which is why - somewhat unexpectedly - you also need to clear the hosts's command history separately.
As for the console host's own history feature:
doskey
-style history feature, before module PSReadline
shipped with PowerShell (see below):
cmd.exe
console window you could use doskey /reinstall
, but that doesn't work in PS).Clear-History
.The PSReadline module comes with PowerShell v5 on Windows 10 and will also ship with Windows Server 2016; it replaces the doskey
-style line-editing and command-history features with more sophisticated functionality; it is also possible to retrofit older Windows editions / PS versions (>= v3) versions with it, using the PowerShell Gallery (PSv3 and PSv4 must first install PowerShellGet).
(Get-PSReadlineOption).HistorySavePath
.[Microsoft.PowerShell.PSConsoleReadLine]::ClearHistory()
can be used to clear the current session's history (note that v1.2+ also supports Alt+F7 for interactive clearing of the current history).
PSReadline
's default history-saving style, SaveIncrementally
, any sensitive commands have already been saved by the time to you call [Microsoft.PowerShell.PSConsoleReadLine]::ClearHistory()
, and will reappear in the next session.Set-PSReadlineOption -HistorySaveStyle SaveAtExit
every time a session starts - the setting apparenly does NOT "stick" by itself - you should be able to get away with only calling [Microsoft.PowerShell.PSConsoleReadLine]::ClearHistory()
(in addition to Clear-History
) without also having to delete the saved-history file, in which case you won't lose your saved history from previous sessions. HOWEVER, AS OF v1.2, SaveAtExit
is BROKEN ALTOGETHER - no history is saved at all; see https://github.com/lzybkr/PSReadLine/issues/262The following advanced function bundles all commands necessary to clear the command history (both for PowerShell itself and the console), both for doskey
-style and PSReadline
-module PowerShell console windows:
Note:
Because it's (currently) the only safe option, PSReadline
's saved-history file is deleted as well, which means the entire history, including from previous sessions, is cleared.
Therefore, a confirmation prompt is shown by default.
<#
# .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
}
}
To clear the on screen display history (F7) you have to press Alt + F7.
This history is managed by the console buffer, not by PowerShell that has its history clearable by the Clear-History
cmdlet.
To script it, try:
[System.Reflection.Assembly]::LoadWithPartialName("System.Windows.Forms")
[System.Windows.Forms.SendKeys]::Sendwait('%{F7 2}')
On Windows 10, the history and sensitive data show up again in future sessions, even after Alt+F7 and clear-history
. It turns out the history is stored in a text file found at:
(Get-PSReadlineOption).HistorySavePath
I delete the offending line from that file or delete the whole file, and then end the current session or clear it via CB's answer