Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Windows PowerShell persistent history

I found this excellent looking method of persisting history in Windows PowerShell.

# Persistent History
# Save last 200 history items on exit
$MaximumHistoryCount = 200
$historyPath = Join-Path (split-path $profile) history.clixml

# Hook powershell's exiting event & hide the registration with -supportevent (from nivot.org)
Register-EngineEvent -SourceIdentifier powershell.exiting -SupportEvent -Action {
    Get-History -Count $MaximumHistoryCount | Export-Clixml (Join-Path (split-path $profile) history.clixml)
}

# Load previous history, if it exists
if ((Test-Path $historyPath)) {
    Import-Clixml $historyPath | ? {$count++;$true} | Add-History
    Write-Host -Fore Green "`nLoaded $count history item(s).`n"
}

# Aliases and functions to make it useful
New-Alias -Name i -Value Invoke-History -Description "Invoke history alias"
Rename-Item Alias:\h original_h -Force
function h { Get-History -c  $MaximumHistoryCount }
function hg($arg) { Get-History -c $MaximumHistoryCount | out-string -stream | select-string $arg }

However, when I paste this into my $PROFILE and restart PowerShell I get the following error:

Register-EngineEvent : Missing an argument for parameter 'Action'. Specify a parameter of type
'System.Management.Automation.ScriptBlock' and try again.
At D:\path\to\WindowsPowerShell\Microsoft.PowerShell_profile.ps1:20 char:73
+ Register-EngineEvent -SourceIdentifier powershell.exiting -SupportEvent -Action
+                                                                         ~~~~~~~
    + CategoryInfo          : InvalidArgument: (:) [Register-EngineEvent], ParameterBindingException
    + FullyQualifiedErrorId : MissingArgument,Microsoft.PowerShell.Commands.RegisterEngineEventCommand
like image 531
alexleonard Avatar asked May 10 '13 03:05

alexleonard


1 Answers

Very related to this question is "How do I access my history using the up/down arrows?" The PSReadLine module solves this:

Install-Package PSReadLine

Then add:

Import-Module PSReadLine

To your $profile.

like image 178
jhclark Avatar answered Sep 23 '22 17:09

jhclark