Question/Request: Is it possible to remove an item from the history? · Issue #1778 · PowerShell/PSReadLine · GitHub
Skip to content

Question/Request: Is it possible to remove an item from the history? #1778

Open

Description

The [Microsoft.PowerShell.PSConsoleReadLine]::AddToHistory method makes it really easy to add a command to the history. Is there a corresponding method to remove a command from the history?

I would like to write a function to bind to a key that would recall the last command from the history so I can correct it. Sort of like an UndoLastCommand function. I would use this after entering a command with a misspelling or other syntax problem. Such a command has no useful purpose in the history (I would never want to execute it again).

Hopefully this description makes sense. Is such a thing possible today? Or would this require some coding within the PSReadLine module before I could write a PowerShell script to do this?

Activity

  1. ghost added
    Needs-Triage 🔍It's a new issue that core contributor team needs to triage.
    on Aug 28, 2020
  2. lzybkr commented on Aug 28, 2020

    @lzybkr
    Contributor

    Not exactly - you can edit the history file, but I think that would only take effect in new instances of PowerShell.

    This wouldn't be too hard to implement in memory, but deleting from the history file gets a bit tricky because of how shared history works - it relies on knowing the length of the history file and knowing that a new command would start at the next offset beyond that length.

  3. benallred commented on Apr 27, 2022

    @benallred

    I'm using this to [kind of] remove an item from the history: https://github.com/benallred/configs/blob/f8814951e66d33feb4ed045b456a2ca60bd46658/powershell/PSReadLine.ps1#L67-L82

    It's not perfect, due to the reasons lzybkr mentioned:

    • It doesn't take effect in the current session
      • Oh, well - at least it makes future sessions nicer
    • It results in some extra new lines in the history file when a new command is saved
      • I haven't noticed this cause any problems, though
  4. camp-007 commented on Jul 14, 2022

    @camp-007

    Thanks Ben Allred (@benallred) for sharing that snippet. That is a very close approximation of the feature I wish was available out of the box. Ideally it would affect the current session, but it is much better than nothing.

    FYI, the extra new lines is a quirk of the Set-Content command and can be avoided by changing it to

    Set-Content (Get-PSReadLineOption).HistorySavePath $history -NoNewline
  5. tygliu commented on Sep 15, 2023

    @tygliu

    Delete commands by Id number:
    Clear-History -Id 3, 5
    Clear-History doc

  6. DJackman123 commented on Sep 15, 2023

    @DJackman123
    Author

    Clear-History is for the wrong history. This post is not talking about the PowerShell session history, but the PSReadLine history that's saved to the (Get-PSReadLineOption).HistorySavePath settting. Clear-History doesn't do anything with that history.

  7. mikesigs commented on Jun 24, 2024

    @mikesigs

    I added this to my profile to help remove items from both history sets.

    function Remove-PSReadlineHistory {
        param (
            [Parameter(Mandatory = $true)]
            [string]$Pattern
        )
    
        $historyPath = (Get-PSReadLineOption).HistorySavePath
        $historyLines = [System.IO.File]::ReadAllLines($historyPath)
        $filteredLines = $historyLines | Where-Object { $_ -notmatch $Pattern }
        [System.IO.File]::WriteAllLines($historyPath, $filteredLines)
    
        Write-Host "Removed $($historyLines.Count - $filteredLines.Count) line(s) from PSReadLine history."
    }
    
    function Remove-PSHistory {
        param (
            [Parameter(Mandatory = $true)]
            [string]$Pattern
        )
        
        $historyLines = Get-History
        $matchingLines = $historyLines | Where-Object { $_.CommandLine -match $Pattern }
        $matchingLines | ForEach-Object { Clear-History -Id $_.Id }
        Write-Host "Removed $($matchingLines.Count) line(s) from PowerShell history."
    }
    
    function Remove-History {
        param (
            [Parameter(Mandatory = $true)]
            [string]$Pattern
        )
    
        Remove-PSReadlineHistory -Pattern $Pattern
        Remove-PSHistory -Pattern $Pattern
    }
  8. gwgaston commented on Jul 30, 2024

    @gwgaston

    Was hoping you guys had learned a few things from Rex Conn. :)

  9. miaLDN commented on Jan 19, 2025

    @miaLDN

    Mike Sigsworth (@mikesigs) thank you :)

    I've just added it to my profile also! I wanted to remove some auto-complete matches that were wrong/useless :)

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions