こんなの絶対おかしいよ!
Powershell で、いろいろ操作して、昨日打ったコマンドを、また実行できると、それはとっても嬉しいなって思うのですが、Powershell を一旦終了してしまうと履歴が保存されずに消えてしまっています。。。
それでもいいの?
さっき打ったコマンドレットを忘れちゃうのに?
さっき打ったコマンドレットのこと、もう二度と感じ取ることさえ出来なくなっちゃうのに??
履歴保存も、履歴補完も、あるんだよ
がんばれば、きちんとした履歴保存機能を作ることができるでしょうが、
できるだけがんばらずに、履歴保存する方向で。
履歴保存も、あるんだよ
- $Profile の中の
function Prompt
にExport-Csv -Path ~\.posh_history.csv -InputObject (Get-History)[-1] -Append
を追記
- ただし、
exit
以外の方法で終了してしまうと、最後に実行した履歴が残らない(終了イベントとかで保存すればいいけど面倒。そこまでするなら、プラグイン化するか、既存のものを使いたい - あと、コマンドなしで Enter を連打してしまうと同じ履歴が、いっぱい残ってしまう(面倒。そこまでするなら(以下略
-
PowerShell 3.0 以上じゃないと、 Export-Csv に -Append オプションがないので、Out-File コマンドで、csv に追記する(初回にヘッダありのファイルを作成しなければならない。。。3.0に比べて、かなり面倒。。。)PowerShell 2.0 のことは忘れましょう
# 2.0 向け(PowerShell 2.0 のことは忘れましょう
if (-not (Test-Path ~\.posh_history.csv)) {
"#TYPE Microsoft.PowerShell.Commands.HistoryInfo" | Out-File ~\.posh_history.csv -encoding UTF8
'"Id","CommandLine","ExecutionStatus","StartExecutionTime","EndExecutionTime"' | Out-File ~\.posh_history.csv -encoding UTF8 -append
}
$h = (Get-History)[-1]
$csv = "`"$($h.Id)`",`"$($h.CommandLine)`",`"$($h.ExecutionStatus)`",`"$($h.StartExecutionTime)`",`"$($h.EndExecutionTime)`""
$csv | Out-File ~\.posh_history.csv -encoding UTF8 -append
履歴読込も、するんだよ
- $Profile に
Import-Csv ~\.posh_history.csv | Add-History
を追記
履歴補完も、あるんだよ
- #
検索したい文字列
<Tab>
例
$Env:USEPROFILE\Documents\WindowsPowerShell\Microsoft.PowerShell_profile.ps1
function Prompt {
# PowerShell 3.0+
Export-Csv -Path ~\.posh_history.csv -InputObject (Get-History)[-1] -Append
return "$pwd > "
}
Import-Csv ~\.posh_history.csv | Add-History
参考
-
lzybkr/PSReadLine
- デフォルト教を信仰するつもりなので、デフォルトの環境と、かなり変わってしまいそうなので、使ってみるのをためらっているが便利そう。
- Windows PowerShell: 歴史を忘れる者たち
- PowerShell コンソールにおける入力履歴管理について - tech.guitarrapc.com
追記
はやく Windows 10 に移行しましょう。