# encoding: ascii
# api: powershell
# title: Enable-HistoryPersistenc
# description: From Windows PowerShell Cookbook (O’Reilly) by Lee Holmes
# version: 0.1
# author: Lee Holmes
# license: CC0
# x-poshcode-id: 2139
# x-archived: 2016-05-17T07:23:58
# x-published: 2011-09-09T21:40:00
#
#
##############################################################################
##
## Enable-HistoryPersistence
##
## From Windows PowerShell Cookbook (O'Reilly)
## by Lee Holmes (http://www.leeholmes.com/guide)
##
##############################################################################
<#
.SYNOPSIS
Reloads any previously saved command history, and registers for the
PowerShell.Exiting engine event to save new history when the shell
exits.
#>
Set-StrictMode -Version Latest
## Load our previous history
$GLOBAL:maximumHistoryCount = 32767
$historyFile = (Join-Path (Split-Path $profile) "commandHistory.clixml")
if(Test-Path $historyFile)
{
Import-CliXml $historyFile | Add-History
}
## Register for the engine shutdown event
$null = Register-EngineEvent -SourceIdentifier `
([System.Management.Automation.PsEngineEvent]::Exiting) -Action {
## Save our history
$historyFile = (Join-Path (Split-Path $profile) "commandHistory.clixml")
$maximumHistoryCount = 1kb
## Get the previous history items
$oldEntries = @()
if(Test-Path $historyFile)
{
$oldEntries = Import-CliXml $historyFile -ErrorAction SilentlyContinue
}
## And merge them with our changes
$currentEntries = Get-History -Count $maximumHistoryCount
$additions = Compare-Object $oldEntries $currentEntries `
-Property CommandLine | Where-Object { $_.SideIndicator -eq "=>" } |
Foreach-Object { $_.CommandLine }
$newEntries = $currentEntries | ? { $additions -contains $_.CommandLine }
## Keep only unique command lines. First sort by CommandLine in
## descending order (so that we keep the newest entries,) and then
## re-sort by StartExecutionTime.
$history = @($oldEntries + $newEntries) |
Sort -Unique -Descending CommandLine | Sort StartExecutionTime
## Finally, keep the last 100
Remove-Item $historyFile
$history | Select -Last 100 | Export-CliXml $historyFile
}