PersistentHistory.psm1
$historyPath = Join-Path (split-path $profile) history.csv function Save-HistoryAll() { $history = Get-History -Count $MaximumHistoryCount [array]::Reverse($history) $history = $history | Group CommandLine | Foreach {$_.Group[0]} [array]::Reverse($history) $history | Export-Csv $historyPath } function Test-HistoryToSave($historyEntry) { $historyEntry.CommandLine.Length -gt 2 } function Save-HistoryIncremental() { # Get-History -Count $MaximumHistoryCount | Group CommandLine | Foreach {$_.Group[0]} | Export-Csv $historyPath Get-History -Count 1 | ? { Test-HistoryToSave $_ } | Export-Csv -Append $historyPath } # hook powershell's exiting event & hide the registration with -supportevent. #Register-EngineEvent -SourceIdentifier powershell.exiting -SupportEvent -Action { Save-History } $oldPrompt = Get-Content function:\prompt if( $oldPrompt -notlike '*Save-HistoryIncremental*' ) { $newPrompt = @' Save-HistoryIncremental '@ $newPrompt += $oldPrompt $function:prompt = [ScriptBlock]::Create($newPrompt) } # load previous history, if it exists if ((Test-Path $historyPath)) { $loadTime = ( Measure-Command { Import-Csv $historyPath | Add-History Save-HistoryAll Clear-History Import-Csv $historyPath | ? {$count++;$true} | Add-History } ).totalseconds Write-Host -Fore Green "`nLoaded $count history item(s) in $loadTime seconds.`n" } function Search-History() { <# .SYNOPSIS Retrive and filter history based on query .DESCRIPTION .PARAMETER Name .EXAMPLE .LINK #> param( [string[]] $query ) $history = Get-History -Count $MaximumHistoryCount foreach ($item in $query){ $item = $item.ToLower() $history = $history | where {$_.CommandLine.ToLower().Contains($item)} } $history } |