Windows Server
 Computer >> コンピューター >  >> システム >> Windows Server

【PowerShell】過去のコマンド履歴を保存・検索・管理する方法(PSReadLine完全解説)

デフォルト設定のWindows PowerShell(およびコマンドプロンプト)は、実行したコマンドの履歴を現在のセッション内にしか保持しません。コンソールウィンドウを閉じたりPCを再起動したりすると、入力したコマンド履歴はどこにも残りません。bashと比較すると、これは大きな弱点でした。しかし、Windows 10 / Windows Server 2016から導入されたPowerShell 5.0以降では、コンソールに入力されたすべてのコマンドがテキスト形式のログファイルへ自動的に保存されるようになりました。

PowerShell 5.0以降におけるコマンド履歴の仕組み

たとえば、複雑なPowerShellコマンドを入力して実行したとします。Windows 10やWindows Server 2016環境であれば、PCを再起動して新しいPowerShellセッションを開いた後でも、上矢印キーを押すだけで直前に実行したコマンドが画面に表示されます。/キーを使えば履歴をさかのぼって確認でき、以前入力したコマンドを再実行することも可能です。

一方、それ以前のバージョンのPowerShellでは、セッションを閉じると履歴は失われます。利用できるのは/キーによる現在のセッション内の履歴参照、またはGet-Historyコマンドレットによる履歴一覧の表示のみです。

現在のセッション内で実行済みコマンドの詳細情報(実行状態、開始時刻、終了時刻、所要時間など)を表示したい場合は、次のコマンドを使用します。

Get-History | Format-List -Property *

【PowerShell】過去のコマンド履歴を保存・検索・管理する方法(PSReadLine完全解説)

Windows 10のPowerShellでは、デフォルトで直近4096件のコマンドが、ユーザープロファイル配下のプレーンテキストファイルに保存されます。パスは以下の通りです。

%userprofile%\AppData\Roaming\Microsoft\Windows\PowerShell\PSReadline\ConsoleHost_history.txt

なお、履歴は「PowerShell」と「PowerShell ISE」でそれぞれ別々に保存される点に注意してください。

【PowerShell】過去のコマンド履歴を保存・検索・管理する方法(PSReadLine完全解説)

また、実行に時間のかかるコマンドは、完了したタイミングで初めて履歴に記録されます。

参考までに、cmd.exeで現在のセッションのコマンド履歴を表示するには以下を実行します。

doskey /history

cmdの履歴を検索するにはF7キーを使用します。

【PowerShell】過去のコマンド履歴を保存・検索・管理する方法(PSReadLine完全解説)

PowerShellのコマンド履歴を検索する方法

上下矢印キーで全履歴をたどるのが面倒な場合は、キーボードショートカットを使った検索が便利です。Ctrl+R(後方検索)やCtrl+S(前方検索)を押してから、探したいコマンドの一部を入力しましょう。入力した文字列は履歴内の任意の位置から照合されます(F8Shift+F8が行頭からの一致のみ対象であるのに対し、こちらは柔軟です)。検索条件に一致した直近のコマンドがコンソールに表示され、一致部分がハイライトされます。

見つかったコマンドが目的と異なる場合は、再度Ctrl+R/Ctrl+Sを押せば、次に一致するコマンドが順番に表示されていきます。

【PowerShell】過去のコマンド履歴を保存・検索・管理する方法(PSReadLine完全解説)

F8キーを使うと、現在のコマンドラインに入力済みの文字列で始まる履歴を検索できます。たとえばget-と入力してF8を押すと、この文字列に一致する最も新しい履歴が呼び出され、さらにF8を押すごとに古い履歴へ移動できます。

【PowerShell】過去のコマンド履歴を保存・検索・管理する方法(PSReadLine完全解説)

さらに、#記号を使った検索も可能です。たとえばGet-WMIで始まる最後のコマンドを探すには、#get-wmiと入力してTabキーを押します。一致するコマンドが自動補完されてコンソールに表示されます。

【PowerShell】過去のコマンド履歴を保存・検索・管理する方法(PSReadLine完全解説)

これらの履歴機能は、従来のWindows PowerShellでも新しめのPowerShell Coreでも同様に動作します。

履歴をNotepad.exeで一覧表示したい場合は、次のコマンドを実行します。

notepad (Get-PSReadLineOption | select -ExpandProperty HistorySavePath)

【PowerShell】過去のコマンド履歴を保存・検索・管理する方法(PSReadLine完全解説)

履歴の中から特定のキーワードに一致するコマンドだけを抽出したい場合は、以下のようにします。

Get-History | Select-String -Pattern "Get-"

【PowerShell】過去のコマンド履歴を保存・検索・管理する方法(PSReadLine完全解説)

PSReadLineモジュールによる履歴管理

PowerShell 5.0のコマンド履歴機能は、Windows Management Framework本体に組み込まれているわけではなく、サードパーティ製のPSReadLineモジュールによって実現されています。このモジュールはコンソールの構文ハイライト表示のほか、マウスでのテキスト選択やCtrl+C/Ctrl+Vによるコピー&ペーストなども担当しており、PowerShellコンソールの機能を大きく拡張します。Windows 10では C:\Program Files\WindowsPowerShell\Modules\PSReadline フォルダに格納されており、コンソール起動時に自動的に読み込まれます。

旧バージョン向けのスタンドアロン版PowerShell 5.0にはPSReadLineは含まれていません。そのため、Windows 7/8.1やWindows Server 2008 R2/2012 R2などの旧OSでも履歴機能を使いたい場合は、Windows Management Framework 5.1のインストールに加えて、PackageManagementモジュール(旧OneGet)経由でオンラインリポジトリからPSReadLineを導入する必要があります。

Install-Module PSReadLine

履歴管理に関連するPSReadLineモジュールの関数一覧と割り当てられたキーは、次のコマンドで確認できます。

Get-PSReadlineKeyHandler | ? {$_.function -like '*hist*'}

Key       Function                Description
---       --------                -----------
UpArrow   PreviousHistory         入力を履歴の前の項目に置き換える
DownArrow NextHistory             入力を履歴の次の項目に置き換える
Ctrl+r    ReverseSearchHistory    履歴を対話的に後方検索する
Ctrl+s    ForwardSearchHistory    履歴を対話的に前方検索する
Alt+F7    ClearHistory            コマンドライン履歴の全項目を削除する(PowerShellの履歴変数は削除しない)
F8        HistorySearchBackward   現在の入力で始まる履歴の前項目を検索する(入力が空の場合はNextHistoryと同等)
Shift+F8  HistorySearchForward    現在の入力で始まる履歴の次項目を検索する(入力が空の場合はNextHistoryと同等)
Unbound   ViSearchHistoryBackward 履歴の後方検索を新規に開始する
Unbound   BeginningOfHistory      履歴の最初の項目へ移動する
Unbound   EndOfHistory            履歴の最終項目(現在の入力)へ移動する

【PowerShell】過去のコマンド履歴を保存・検索・管理する方法(PSReadLine完全解説)

履歴の動作はGet-PSReadlineOptionおよびSet-PSReadlineOptionコマンドレットで細かく制御できます。現在の設定値を確認するには、次のコマンドを実行します。

Get-PSReadlineOption | select HistoryNoDuplicates, MaximumHistoryCount, HistorySearchCursorMovesToEnd, HistorySearchCaseSensitive, HistorySavePath, HistorySaveStyle

【PowerShell】過去のコマンド履歴を保存・検索・管理する方法(PSReadLine完全解説)

特に把握しておきたい主要なパラメータは以下の通りです。

  • HistoryNoDuplicates:同一コマンドの重複登録を防ぐかどうかを指定します。
  • MaximumHistoryCount:保存される履歴の最大件数です(デフォルトは4096件)。
  • HistorySearchCursorMovesToEnd:検索時にカーソルを行末へ移動させるかどうかを指定します。
  • HistorySearchCaseSensitive:検索時の大文字・小文字の区別を指定します(デフォルトは区別なし)。
  • HistorySavePath:履歴ファイルの保存先パスを示します。
  • HistorySaveStyle:履歴の保存タイミングに関する動作を指定します。
    • SaveIncrementally:コマンド実行の都度、逐次保存する(デフォルト)。
    • SaveAtExit:PowerShellコンソールを閉じる際にまとめて保存する。
    • SaveNothing:履歴の保存自体を無効化する。

設定を変更するにはSet-PSReadlineOptionを使用します。たとえば、コンソール終了時にまとめて保存するよう変更する例がこちらです。

Set-PSReadlineOption -HistorySaveStyle SaveAtExit

【PowerShell】過去のコマンド履歴を保存・検索・管理する方法(PSReadLine完全解説)

ログファイルに保存できる履歴の上限件数を増やしたい場合は、次のコマンドを実行します。

Set-PSReadlineOption -MaximumHistoryCount 10000

このように、実行済みコマンドの履歴を永続的に保存できる点は、cmdではなくPowerShellコンソールを選ぶべき大きな理由のひとつといえるでしょう。

PowerShellコンソールの履歴を消去する方法

前述のとおり、PSReadLineモジュールはすべてのコンソール操作をテキストファイルに書き込みます。しかし管理者は、資格情報、パスワード、サーバーアドレス、個人情報などの機密性の高い情報をコンソールに入力することがあります。平文の履歴ファイルが残っていれば、別の管理者や攻撃者に情報を読み取られる恐れがあります。セキュリティ対策として、履歴の消去や履歴機能自体の無効化が必要になる場合もあります。

Clear-Historyコマンドレットで消せるのは、あくまで現在のセッションのメモリ上の履歴(Get-Historyで表示される内容)だけです。

直近のコマンドを1件だけ削除する例:

Clear-History -count 1 -newest

特定のパターンに一致するコマンドだけを一括消去する例:

Clear-History -CommandLine *set-ad*

過去のPowerShellコマンド履歴を完全に消去するには、PSReadLineが履歴を書き込んでいるConsoleHost_history.txtファイル自体を削除する必要があります。現在の履歴ファイルのパスを取得して削除するには、次のコマンドを使用します。

Remove-Item (Get-PSReadlineOption).HistorySavePath

削除後は、必ずPowerShellコンソールのウィンドウを閉じてください。

テキストファイルへの履歴保存を完全に無効化したい場合は、以下のコマンドを実行します。

Set-PSReadlineOption -HistorySaveStyle SaveNothing

【PowerShell】過去のコマンド履歴を保存・検索・管理する方法(PSReadLine完全解説)

PowerShellコマンド履歴を他のセッションへエクスポート/インポートする方法

よく使うコマンド群を複数のPCで共通して利用したいケースもあるでしょう。その場合は、現在のPCのコマンド履歴をXMLファイルにエクスポートし、別のPCへインポートすれば共有できます。あるいは、ConsoleHost_history.txtファイルを対象ユーザーのプロファイルにコピーする方法でも実現可能です。

現在のセッションのコマンドをファイルへ書き出すには、Export-Clixmlコマンドレットを使用します。

Get-History | Export-Clixml -Path c:\ps\commands_hist.xml

ファイルから履歴を読み込み、別のPoShセッション(同一マシンでも別マシンでも可)へ取り込むには、次のようにします。

Add-History -InputObject (Import-Clixml -Path c:\ps\commands_hist.xml)

【PowerShell】過去のコマンド履歴を保存・検索・管理する方法(PSReadLine完全解説)

セッション終了時に履歴を自動的にファイルへ書き出すこともできます。そのためには、PoShセッションの終了イベントにスクリプトをバインドします(※セッションは必ずexitコマンドで終了する必要があり、単にウィンドウを閉じただけでは動作しません)。

$HistFile = Join-Path ([Environment]::GetFolderPath('UserProfile')) .ps_history
Register-EngineEvent PowerShell.Exiting -Action { Get-History | Export-Clixml $HistFile } | out-null
if (Test-path $HistFile) { Import-Clixml $HistFile | Add-History }

  1. Windows 10でコマンドプロンプトとPowerShellのレガシーコンソールを有効/無効にする方法

    Windows 10では、コマンドプロンプトに多くの新機能が搭載されました。しかし、その存在を知らないユーザーも少なくありません。例えば、行の折り返し表示、コマンドプロンプトウィンドウのサイズ変更、ウィンドウの透明度調整、Ctrlキーを使ったショートカット(Ctrl+A、Ctrl+C、Ctrl+Vなど)といった便利な機能が利用できます。 ただし、これらの機能を使用するには、コマンドプロンプトの「従来のコンソールを使用する」設定を無効にする必要があります。PowerShellも同様に、コマンドプロンプトと同じ機能を備えており、これらの機能を活用するには「従来のコンソールを使用する」を無効化する

  2. コマンドプロンプトとPowerShellでアプリをインストールする方法|Chocolatey完全ガイド

    ソフトウェアのインストールは、手間がかかり、繰り返し作業になりやすく、ミスも起こりやすいプロセスです。アプリを使い始めるまでに、ダウンロード→インストーラーの起動→完了待ちという流れが必要で、多くの時間を消費します。コマンドプロンプトからのアプリインストール方法を覚えれば、この時間を大幅に節約できます。さらにPowerShellを使えば、複数のアプリを同時にインストールすることも可能です。 PowerShellとコマンドプロンプトは、Windows 10/11上のアプリケーションをスムーズにインストールできるツールです。ただし、それぞれインストール手順には若干の違いがあります。本ガイドでは、コ