Récemment, j'ai dû exécuter une commande qui m'a malheureusement obligé à taper un mot de passe directement sur la ligne de commande.
Ensuite, j'ai effacé mon écran avec "Clear", mais j'ai également voulu effacer l'historique des commandes afin que la commande incriminée n'apparaisse pas dans l'historique des sessions. Malheureusement, la cmdlet Clear-History ne semble pas vraiment faire ce que prétend sa documentation - l'exécution de Clear-History ne semble avoir aucun impact sur l'historique de la session.
Je peux toujours voir les commandes précédentes dans le menu historique contextuel et faire défiler les anciennes commandes en appuyant sur la touche Haut. Voici une capture d'écran illustrant le problème:
J'ai vérifié avec Get-Command que Clear-History exécute bien l'applet de commande PowerShell intégrée attendue.
J'ai essayé quelques variantes, telles que "Clear-History -count 10 -newest", toutes ne montrant aucun effet. Lorsque je spécifie un ID d'historique exact, tel que "Clear-History -id 3", je reçois une erreur comme celle-ci:
Clear-History : Cannot locate history for Id 3.
Même si je peux voir la commande n ° 3 à l'écran.
Pour compléter réponse utile de CB. et réponse utile de JVimes :
Le mécanisme d'historique de PowerShell (Get-History
, Clear-History
) Est Indépendant de l'hôte , c'est pourquoi - de façon quelque peu inattendue - vous devez également effacer l'historique des commandes hosts séparément.
Quant à la fonction d'historique de l'hôte de la console :
doskey
- fonction d'historique de style , avant le module PSReadline
livré avec PowerShell (voir ci-dessous):
cmd.exe
, vous pouvez utiliser doskey /reinstall
, mais cela ne fonctionne pas dans PS).Clear-History
.Le module PSReadline
est livré avec PowerShell v5 sur Windows 10 et sera également livré avec Windows Server 2016 ; il remplace les fonctions d'édition de ligne et d'historique des commandes de style doskey
par des fonctionnalités plus sophistiquées ; il est également possible de mettre à niveau les anciennes éditions Windows/versions PS (> = v3) avec, en utilisant PowerShell Gallery (PSv3 et PSv4 doivent d'abord installer PowerShellGet ).
(Get-PSReadlineOption).HistorySavePath
.[Microsoft.PowerShell.PSConsoleReadLine]::ClearHistory()
peut être utilisé pour effacer l'historique de la session actuelle (notez que v1.2 + prend également en charge Alt+F7 pour la suppression interactive de l'historique actuel. PSReadline
, SaveIncrementally
, toutes les commandes sensibles ont déjà été enregistrées au moment où vous appelez [Microsoft.PowerShell.PSConsoleReadLine]::ClearHistory()
, et réapparaissent dans la session suivante.Set-PSReadlineOption -HistorySaveStyle SaveAtExit
à chaque démarrage d'une session - le réglage apparemment ne "colle" pas par lui-même - vous devriez être capable de vous en sortir en appelant uniquement [Microsoft.PowerShell.PSConsoleReadLine]::ClearHistory()
(en plus de Clear-History
) sans avoir à supprimez le fichier d'historique enregistré, auquel cas vous ne perdrez pas votre historique enregistré des sessions précédentes. CEPENDANT, À PARTIR DE v1.2, SaveAtExit
est ENTIÈREMENT BRISÉ - aucun historique n'est enregistré du tout; voir https://github.com/lzybkr/PSReadLine/issues/262La fonction avancée suivante regroupe toutes les commandes nécessaires pour effacer l'historique des commandes (à la fois pour PowerShell lui-même et pour la console), à la fois pour le style doskey
- et PSReadline
- fenêtres de la console PowerShell du module:
Remarque:
Parce que c'est (actuellement) la seule option sûre, le fichier d'historique enregistré de PSReadline
est également supprimé, ce qui signifie que l'historique complet , y compris des sessions précédentes, est effacé .
Par conséquent, une invite de confirmation est affichée par défaut.
<#
# .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
}
}
Sous Windows 10 , l'historique et les données sensibles réapparaissent dans les futures sessions, même après Alt + F7 et clear-history
. la solution que j'ai trouvée était:
Remove-Item (Get-PSReadlineOption).HistorySavePath
Ensuite, mettez fin à la session en cours ou effacez-la via réponse de CB
Pour effacer l'historique d'affichage à l'écran (F7) vous devez appuyer sur Alt + F7.
Cet historique est géré par le tampon de la console, et non par PowerShell qui a son historique effaçable par le Clear-History
applet de commande.
Pour l'écrire, essayez:
[System.Reflection.Assembly]::LoadWithPartialName("System.Windows.Forms")
[System.Windows.Forms.SendKeys]::Sendwait('%{F7 2}')