Powershell Clear-L'histoire N'efface pas L'histoire

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. Par la suite, j'ai effacé mon écran avec "Clear", mais je voulais aussi effacer l'historique des commandes afin que la commande incriminée n'apparaisse pas dans l'historique de la session. Malheureusement, l'applet de commande clear-history ne semble pas faire ce que sa documentation prétend - l'exécution de clear-history ne semble pas avoir d'impact sur l'historique de la session. Je peux toujours voir les commandes précédentes dans le menu contextuel historique, et faites défiler les anciennes commandes en appuyant sur la touche up. Voici un screengrab démontrant le problème:

<a href=Powershell effacer l'échec de l'historique" src="/images/content/13257775/61f6284e44f7375f7e9146692bac0fc1.png">

J'ai vérifié avec Get-Command que Clear-History exécute effectivement l'applet de commande powershell intégrée attendue.

J'ai essayé quelques variations, 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 ce:

Clear-History : Cannot locate history for Id 3.

, Même si je peux voir la commande #3 sur l'écran. Toute contribution ou idée serait appréciée.

21
demandé sur Fopedush 2012-11-06 23:13:53

3 réponses

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 dont l'historique peut être effacé par clear-history cmdlet

Pour le script, essayez:

[system.reflection.assembly]::loadwithpartialname("System.Windows.Forms")
[System.Windows.Forms.SendKeys]::Sendwait('%{F7 2}')
27
répondu CB. 2012-11-06 19:54:10

Sous Windows 10 , l'historique et les données sensibles apparaissent à nouveau dans les sessions futures, même après Alt + F7 et clear-history. La solution que j'ai trouvée était:

Remove-Item (Get-PSReadlineOption).HistorySavePath

Ensuite, terminez la session en cours ou effacez-la via la réponse de CB

32
répondu Vimes 2017-05-23 11:54:50

Pour compléter CB.réponse utile et réponse utile de JVimes :

  • Le mécanisme 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 commandesdes hôtes séparément.

  • Quant à la fonction d'historique de l'hôte de la console :

    • doskey-Histoire du style caractéristique , avant module PSReadline livré avec PowerShell (voir ci-dessous):

      • Il n'y a aucun enregistré historique - un historique est conservé uniquement pendant 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.la réponse vous montre comment simuler ce clavier la combinaison; rappelez-vous: ce doit être utilisé en plus Clear-History.
    • Le PSReadline module est livré avec PowerShell V5 sur Windows 10 et sera également livré avec Windows Server 2016 ; Il remplace le doskey-Style ligne d'édition et de l'historique des commandes avec des fonctionnalités plus sophistiquées; Il est également possible de moderniser les anciennes éditions Windows / versions PS (>=v3) versions avec elle, en utilisant laPowerShell et PSv4 doit d'abord installer PowerShellGet ).

      • Commande histoire est maintenant enregistrées à travers des séances de, dans le fichier
        (Get-PSReadlineOption).HistorySavePath.
      • [Microsoft.PowerShell.PSConsoleReadLine]::ClearHistory() peut être utilisé pour effacer l'historique de la session en cours (notez que la version 1.2 + prend également en charge Alt+F7 pour la suppression interactive de l'historique actuel.
        • mise en garde : avec le style de sauvegarde de l'historique par défaut de PSReadline, SaveIncrementally, toutes les commandes sensibles ont déjà été enregistré au moment où vous appelez [Microsoft.PowerShell.PSConsoleReadLine]::ClearHistory(), et réapparaîtra dans la session suivante .
        • la seule façon de gérer cela est supprimer le fichier d'historique enregistré, comme démontré dans la réponse de JVimes qui, cependant, efface invariablement l'historique entier.
        • si vous configurez votre profil pour appeler Set-PSReadlineOption -HistorySaveStyle SaveAtExit chaque fois qu'une session démarre-le paramètre ne semble pas "coller" par lui-même-vous devriez être capable de s'en sortir en appelant seulement [Microsoft.PowerShell.PSConsoleReadLine]::ClearHistory() (en plus de Clear-History) sans avoir à supprimer 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 complètement cassé - 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 historique des commandes (à la fois pour PowerShell lui-même et la console), à la fois pour doskey-style et PSReadline-module PowerShell console windows:

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 de , 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

  }

}
12
répondu mklement0 2017-05-23 11:54:50