Powershell Clear-History no hace Clear History
(3)
Recientemente tuve que ejecutar un comando que, desafortunadamente, me obligó a escribir una contraseña directamente en la línea de comandos. Luego, borré mi pantalla con "Borrar", pero también quería borrar el historial de comandos para que el comando ofensivo no se mostrara en el historial de la sesión. Desafortunadamente, el cmdlet de historial claro no parece realmente hacer lo que dice su documentación: ejecutar el historial claro no parece tener ningún impacto en el historial de la sesión. Todavía puedo ver los comandos anteriores en el menú emergente del historial y desplazarme por los comandos antiguos presionando la tecla de arriba. Aquí hay un screengrab que demuestra el problema:
He comprobado con Get-Command que Clear-History está ejecutando el cmdlet integrado de powershell esperado.
He intentado algunas variaciones, como "Clear-History -count 10 -newest", todas fallando en mostrar ningún efecto. Cuando especifico un ID de historial exacto, como "Clear-History -id 3", recibo un error como este:
Clear-History : Cannot locate history for Id 3.
Incluso si puedo ver el comando # 3 en la pantalla. Cualquier aportación o ideas serían apreciadas.
Para borrar el historial de visualización en pantalla (F7), debe presionar ALT + F7.
Este historial es administrado por el búfer de la consola, no por powershell que tiene su historial que se puede clear-history
cmdlet de clear-history
para escribirlo intente:
[system.reflection.assembly]::loadwithpartialname("System.Windows.Forms")
[System.Windows.Forms.SendKeys]::Sendwait(''%{F7 2}'')
Para complementar la respuesta útil de CB y la respuesta útil de JVimes :
El propio mecanismo de historial de PowerShell (
Get-History
,Clear-History
) es independiente del host , por lo que, de forma algo inesperada, también debe borrar el historial de comandos de los hosts por separado .En cuanto a la característica de historial del host de la consola :
función de historial de estilo
doskey
, antes del móduloPSReadline
enviado con PowerShell (ver más abajo):- No hay un historial guardado , un historial se guarda solo durante la sesión actual.
- Se debe utilizar Alt + F7 para borrar el historial de la consola , sin una forma programática (obvia) de hacerlo (en una ventana de consola
cmd.exe
puede usardoskey /reinstall
, pero eso no funciona en PS). - La respuesta de CB. te muestra cómo simular esta combinación de teclado; recuerda: esto debe usarse además de
Clear-History
.
El módulo
PSReadline
viene con PowerShell v5 en Windows 10 y también se enviará con Windows Server 2016 ; reemplaza las funciones de edición de línea y historial de comandos de estilodoskey
con una funcionalidad más sofisticada ; también es posible actualizar versiones anteriores de Windows / versiones de PS (> = v3) con la Galería de PowerShell (PSv3 y PSv4 primero deben instalar PowerShellGet ).- El historial de comandos ahora se guarda en sesiones , en archivo
(Get-PSReadlineOption).HistorySavePath
. -
[Microsoft.PowerShell.PSConsoleReadLine]::ClearHistory()
se puede usar para borrar el historial de la sesión actual (tenga en cuenta que v1.2 + también es compatible con Alt + F7 para el borrado interactivo del historial actual.- CAVEAT : Con el estilo de guardado histórico predeterminado de
SaveIncrementally
,SaveIncrementally
, todos los comandos confidenciales ya se han guardado para cuando llame a[Microsoft.PowerShell.PSConsoleReadLine]::ClearHistory()
, y volverá a aparecer en la siguiente sesión . - La única forma de manejar esto es eliminar el archivo de historial guardado , como se demostró en la respuesta de JVimes que, sin embargo, invariablemente borra todo el historial .
- SI configura su perfil para llamar a
Set-PSReadlineOption -HistorySaveStyle SaveAtExit
cada vez que se inicia una sesión (aparentemente la configuración NO se "pega" por sí sola) debe poder salirse con la suya solo llamando a[Microsoft.PowerShell.PSConsoleReadLine]::ClearHistory()
(además deClear-History
) sin tener que eliminar el archivo del historial guardado, en cuyo caso no perderá su historial guardado de sesiones anteriores. SIN EMBARGO, A PARTIR DE LASaveAtExit
,SaveAtExit
se rompe , no se guarda ningún historial; vea https://github.com/lzybkr/PSReadLine/issues/262
- CAVEAT : Con el estilo de guardado histórico predeterminado de
- El historial de comandos ahora se guarda en sesiones , en archivo
La siguiente función avanzada agrupa todos los comandos necesarios para borrar el historial de comandos (tanto para PowerShell como para la consola), tanto para doskey
ventanas de consola de PowerShell de doskey
- PSReadline
y PSReadline
-module:
Nota:
Debido a que (actualmente) es la única opción segura, el archivo de historial guardado de
PSReadline
se elimina, lo que significa que se borra todo el historial, incluidas las sesiones anteriores .Por lo tanto, un mensaje de confirmación se muestra de forma predeterminada.
<#
# .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://.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
}
}
En Windows 10 , el historial y los datos confidenciales vuelven a aparecer en sesiones futuras, incluso después de Alt + F7 y clear-history
. La solución que encontré fue:
Remove-Item (Get-PSReadlineOption).HistorySavePath
Luego, finalice la sesión actual o bórrela a través de la respuesta de CB