-
Notifications
You must be signed in to change notification settings - Fork 287
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Question/Request: Is it possible to remove an item from the history? #1778
Comments
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. |
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:
|
Thanks @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 (Get-PSReadLineOption).HistorySavePath $history -NoNewline |
Delete commands by Id number: |
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. |
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
} |
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?
The text was updated successfully, but these errors were encountered: