Windows PowerShell ではコマンド履歴を自動的に保存する機能が適切に備わっており、入力した内容を再実行する必要がある場合には便利です。基本的に、すべてのコマンドがテキスト ファイルに記録されます。もちろん、Windows では必要以上に難しくする必要があるためです。%userprofile%\AppData\Roaming\Microsoft\Windows\PowerShell\PSReadLine\ConsoleHost_history.txtにある ConsoleHost_history.txt ファイルに、この証拠が示されています。そのため、保存された履歴を覗き見したり、中断したところから再開したりしたい場合は、すべてそこにあります。さらに、現在のセッションでGet-Historyなどのコマンドを使用したり、コンソールで上矢印を使用してすばやくアクセスしたりすることもできます。ただし、注意が必要です。ウィンドウを閉じると、他の場所に保存しない限り、履歴は消去されます。
この設定は、機密情報を扱う人にとってはかなりイライラするものです。パスワード、トークン、個人情報を含むコマンドをコピーして消去し忘れると、その情報がプレーンテキストファイルに残ってしまいます。プライバシーが重要な場合は、この管理方法を知っておくことが重要です。幸いなことに、PowerShellではこの履歴を管理または消去できます。これは、個人の認証情報を扱っている場合や、セキュリティ上の理由で整理整頓したい場合に必要になるかもしれません。
PowerShellのコマンド履歴を修正してより適切に制御する方法
PowerShell 履歴の表示と管理
- PowerShellでは、 を押すとUp arrowセッション内の過去のコマンドが順に切り替わるので、簡単な繰り返しであれば再入力する必要はありません。また、Get-Historyコマンドを使えば、タイムスタンプなどの詳細情報を含め、これまでに実行したすべてのコマンドを一覧表示できます。特定のコマンドを再実行したい場合は、リストからコマンドIDをメモして、 と入力するだけです
Invoke-History 6。少し扱いにくいですが、問題なく動作します。 - Windows PowerShell 5.1 と PowerShell Core は、最大 4096 個のコマンドを謎の履歴ファイルに保存します。メモ帳などのテキストエディターで開くには、次のコマンドを使用します
notepad (Get-PSReadLineOption | select -ExpandProperty HistorySavePath)。開いているセッションの外部に保存されたコマンドを確認したい場合に役立ちます。
コマンド履歴を検索する
- 何百ものコマンドをスクロールするのはもうやめましょう。これらのキーを押した後、 Ctrl+Rで逆方向検索、Ctrl+Sで順方向検索を試してみてください。コマンドの一部を入力すると、保存済みのコマンドが検索されます。矢印キーでコマンドを検索するよりも高速です。目的のコマンドが見つかるまでCTRL+Rまたはを押し続けるか、 を押してキャンセルしてください。CTRL+SEsc
- 特定の文字列で始まるコマンドを素早く検索したい場合は、
#get-wmi(またはパターン)を入力して を押すだけですTab。最後に一致したコマンドが表示されます。少し奇妙ですが、便利です。
PowerShell がコマンド履歴を保存する方法を構成する
- デフォルトではPSReadLineが履歴を処理しますが、その動作を調整できます。現在の設定を確認するには、次のコマンドを実行し、 HistoryNoDuplicates(コマンドの重複を回避)、MaximumHistoryCount(保存可能なコマンドの最大数、デフォルトは4096)、HistorySavePath
Get-PSReadlineOption | select(保存場所)などのオプションにチェックを入れてください。履歴をさらに保存したい場合は、カウントを増やしてください 。Set-PSReadlineOption -MaximumHistoryCount 10000 - セキュリティ上の懸念がある場合は、重複したコマンドを保存しないように設定したり、保存を完全に無効にしたりすることもできます。例:
Set-PSReadlineOption -HistorySaveStyle SaveNothing。これにより、各セッション後に何も保存されなくなります。 - もう1つの便利なトリック:PowerShellでスペースで始まるコマンドを無視するように設定できます。例えば、次のプロファイルコードを追加します。
Set-PSReadLineOption -AddToHistoryHandler { param($command) if ($command -like ' *') { return $false } return $true }スペースで始まるコマンドは保存されません。もちろん、PowerShell は非常に複雑で、実行ポリシーをRemotesignedに設定しないと動作しません。
Set-ExecutionPolicy Remotesigned
機密コマンドを保護し、履歴を消去する
- パスワード、キー、または機密情報を入力して保存したくない場合は、上記のように、PowerShell でスペースで始まるコマンドを無視するように設定できます。さらに安全性を高めるために、履歴テキストファイルを手動で削除することもできます。
Remove-Item (Get-PSReadLineOption).HistorySavePath - なお、これは保存された履歴のみを消去し、現在のセッションは消去しません。現在の履歴を消去するには、
Clear-Historyセッションに対して次のコマンドを実行するか、履歴ファイルを削除して完全に消去してください。 - PowerShell による履歴の自動保存を停止したい場合は、次の操作を実行してください
Set-PSReadlineOption -HistorySaveStyle SaveNothing。ただし、これにより便利な呼び出し機能が完全に失われることに注意してください。
他の場所で使用するコマンド履歴のエクスポートとインポート
- 保存したコマンドを複数のコンピューターやセッションで使用したい場合は、 を使用してエクスポートします。
Get-History | Export-Clixml -Path c:\ps\commands_hist.xmlコマンドを新しいセッションに取り込むには、 を使用してエクスポートしますAdd-History -InputObject (Import-Clixml -Path c:\ps\commands_hist.xml)。 - %userprofile%\AppData\Roaming\Microsoft\Windows\PowerShell\PSReadLine\ConsoleHost_history.txtのような履歴ファイル全体を別のマシンのプロファイルフォルダにコピーすることを好む人もいます。これは面倒ですが、正しく設定すれば問題なく機能します。
PowerShellの履歴システムは、一度使いこなせば非常に柔軟です。しかし一方で、機密性の高い情報を扱う場合や、より詳細な制御が必要な場合は、少々面倒です。設定をいじって履歴ファイルを手動で管理することで、後々面倒な作業を軽減できるかもしれません。