PSReadLineのHistory保存を制御

PSReadLineネタな

PSReadlineOptionAddToHistoryHandler というのがある
History 保存時に実行される ScriptBlock を指定できるぞ

PSReadLine はコマンドが実行される度に $(Get-PSReadlineOption).HistorySavePath に履歴を残すようになってます
PowerShellがもともと持ってる history とは関係ないんですね

で、場合によってはコマンド履歴に保存したくなーいなんてことがあるわけで

そこで AddToHistoryHandler の出番です

PS> help Set-PSReadlineOption -Parameter AddToHistoryHandler

-AddToHistoryHandler <Func[string,bool]>

    必須                         false
    位置                         名前付き
    パイプライン入力を許可する   false
    パラメーター セット名           OptionsSet
    エイリアス                      なし
    動的                     false

ヘルプを見ると型が [Func[string,bool]] になってるけどこれ、PowerShellでは Stringを受けてboolが返るScriptBlock でOKです
OKでした

ぼくの場合は直前に実行されたコマンドと同じものを実行した場合は保存しないといいなぁって常々思ってたのでそうしました
$PROFILE でもって指定しとくといいでしょう

# PSReadLine が入ってたら設定する
if ($(Get-Module -ListAvailable -Name PSReadLine))
{
    Set-PSReadlineOption -AddToHistoryHandler {
        param($Command)
        $LastCommand = $(cat $(Get-PSReadlineOption).HistorySavePath -Tail $([regex]::Matches($Command, '\n').Count + 1) -Encoding UTF8) -join ''
        return $LastCommand -ne ($Command -replace '\n','`')
    }
}

複数行コマンドにも対応したらなんだか複雑になっちゃったな
入力コマンドの行数分tailで読みだしてから各行を連結
履歴の複数行コマンドは行末に ` が入ってるので入力コマンドの改行を ` に置換
それらを比較して一致してなかったら履歴に保存、といった具合です

あと、最初に PSReadLine が入ってるかどうかも確認してます
Windows10未満だとデフォで入ってないですからね

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト / 変更 )

%s と連携中