web-dev-qa-db-fra.com

PowerShell Clear-History ne supprime pas l'historique

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:

PowerShell clear history failure

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.

39
Fopedush

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):

      • Il n'y a pas enregistré historique - un historique n'est conservé que pour la durée de la session en cours.
      • Alt+F7 doit être utilisé pour effacer l'historique de la console , sans moyen programmatique (évident) de le faire (dans une fenêtre de console cmd.exe, vous pouvez utiliser doskey /reinstall, mais cela ne fonctionne pas dans PS).
      • CB's's answer vous montre comment simuler cette combinaison de clavier; rappelez-vous: cela doit être utilisé dans en plus deClear-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 ).

      • L'historique des commandes est maintenant enregistré dans toutes les sessions, dans le fichier
        (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.
        • [~ # ~] mise en garde [~ # ~] : Avec le style de sauvegarde d'historique par défaut de 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.
        • La seule façon de gérer cela est de supprimer le fichier d'historique enregistré , comme démontré dans réponse de JVimes qui, cependant, efface invariablement l'historique complet .
        • [~ # ~] si [~ # ~] vous configurez votre profil pour appeler 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/262

La 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

  }

}
20
mklement0

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

58
Vimes

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}')
32
CB.