PowerShellで直前に実行したコマンドを簡単に再入力したり実行履歴を取得する方法
本エントリーの目次
PowerShellで実行済みのコマンドを再入力したい!実行履歴を取得したい!
PowerShellを使っているときに、直前に実行したコマンドや、少し前に実行したコマンドを再度入力したい場合があります。
たとえば末尾のパラメーターだけを変更し、同じコマンドレットを何度も連続して実行したい!
といったケースが考えられますね。
PowerShellでは幸いなことに、直前に実行したコマンドを簡単に呼び出す機能が搭載されています。
そのため、この機能を利用して直前に実行したコマンドを簡単に呼び出し、末尾のパラメーターだけを変更して、コマンドを実行!
といったような運用操作が可能となります。
さらにPowerShellでは、過去に実行したコマンドの一覧(コマンドの実行履歴)を取得することも可能です。
この機能は作業手順書(コマンドの実行手順)を作ったり、運用者の作業ログ(作業記録)の作成に利用できます。
そこで今回は、PowerShellを使っているときに、直前に実行したコマンドを簡単に再入力する方法や、PowerShellのコマンドの実行履歴を取得する方法をご紹介します!
PowerShellで直前に実行したコマンドや少し前に実行したコマンドを、簡単に再入力する方法
PowerShellで直前に実行したコマンドや少し前に実行したコマンドを再入力したいときは、以下のような方法で入力を行います。
キーボードの矢印キーを使う方法
PowerShellでは、キーボードの矢印キーの『↑(上)』キーと『↓(下)』キーを使うことで、以前に実行したコマンドを簡単に再入力できます。
たとえばPowerShellを起動してから、以下の順番でコマンドレットを実行したとしましょう。
- Get-Location
- Get-HotFix
- Get-ComputerInfo
『Get-ComputerInfo』コマンドレットを実行した後にキーボードの『↑』キーを1回押下することで、直前に実行した『Get-ComputerInfo』コマンドレットが自動的に再入力されます。
もう一度『↑』キーを押下すると、『Get-HotFix』コマンドレットが再入力され、さらにもう一度『↑』キーを押下すると、『Get-Location』コマンドレットが再入力される。
そしてこの状態で『↓』キーを押下すると、『Get-HotFix』コマンドレットが再入力される、という仕組みとなっています。
つまりキーボードの『↑』キーを押すたびに、実行履歴を一つさかのぼる。
『↓』キーを押すことで、さかのぼった実行履歴を一つ戻る、というわけです。
『↑』キーや『↓』キーを操作し、実行したいコマンドレットの実行履歴を表示したら、『Enter』キーを押下すれば、現在表示中のコマンドレットが実行されます。
また、実行したいコマンドレットの実行履歴を表示後、パラメーターを変更するなど、一部コマンドの内容を変更してから実行することも、もちろん可能です。
#コマンド文字列の一部の入力 + 『Tab』キー押下を利用する方法
この方法では、コマンドの文字列の一部を指定して、過去の実行履歴を自動入力します。
たとえばPowerShellを起動してから、以下の順番でコマンド操作を実行したとしましょう。
- Get-Location
- Get-HotFix
- Set-Location “c:\”
- w32tm /query /status
- Get-ComputerInfo
そして『Get-ComputerInfo』コマンドレットを実行した後に、『#Get』と入力してから、キーボードの『Tab』キーを押下してください。
キーボードの『Tab』キーの位置の例:
すると『Tab』キーを押すたびに以下のような順番で、直前に実行したコマンドが自動的に再入力されます。
- Get-ComputerInfo
- Get-HotFix
- Get-Location
- Get-ComputerInfo
以下繰り返し …
上記動作を見ると分かるとおり、#の後に指定したGetという文字列を含むコマンドの実行履歴のみを対象として、順番に取得・再入力されます。
PowerShellのコマンドの実行履歴を取得する方法
PowerShellのコマンドの実行履歴を取得したいときは、『Get-History』コマンドレットを使用すると良いでしょう。
『Get-History』コマンドレットを使用すると、以下のような結果を取得できます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | PS C:\> Get-History Id CommandLine -- ----------- 1 Set-Location "c:\" 2 Get-Location 3 Get-HotFix 4 Get-ComputerInfo 5 Resolve-DnsName haruru29.net 6 w32tm /query /status 7 Get-Alias 8 Get-ChildItem 9 Get-ExecutionPolicy 10 Get-Date 11 Get-DnsClientCache PS C:\> |
『Get-History』コマンドレットでは、実行順序と同じ順番で結果が取得されます。
そのため上記実行結果の例では、一番最初に実行したのが『Set-Location』コマンドレット。
そして一番最後に実行したのが『Get-DnsClientCache』コマンドレットとなります。
ID番号を指定して実行履歴を表示する方法
『Get-History』コマンドレットには、ID番号を指定して実行履歴を表示する『-Id』パラメーターが用意されています。
たとえばID番号が4である実行履歴を表示したいときは、以下コマンドを実行します。
1 | Get-History -Id 4 |
取得する履歴の数を指定して実行履歴を取得する方法
取得する履歴の数を指定して実行履歴を取得したい場合には、『-Count』パラメーターを併用してください。
たとえば直近の実行履歴を3つ取得したい場合には、以下コマンドを実行します。
1 | Get-History -Count 3 |
また『-Count』パラメーターは『-Id』パラメーターと同時使用が可能です。
そのためID4の実行コマンド以前の実行履歴を3つ取得したいときは、以下のコマンドを実行してください。
1 | Get-History -Id 4 -Count 3 |
上記コマンドを実行することで、ID4、ID3、ID2の3つの実行履歴が取得されます。
特定文字列を含むコマンドの実行履歴のみを取得する方法
過去に実行したコマンドのうち、特定文字列を含むコマンドの実行履歴のみを抽出して取得したいケースもあるでしょう。
こういったケースでは『Where-Object』コマンドレットを併用すると良いでしょう。
たとえば過去に実行したコマンドの中から、『Location』という文字列を含む実行履歴のみを取得したい場合には、以下コマンドを実行します。
1 | Get-History | Where-Object {$_.CommandLine -like "*Location*"} |
実行履歴のIDを指定して、コマンドを実行する方法
『Get-History』コマンドレットを使って取得した実行履歴のID番号を使い、過去に実行したコマンドを再度実行することも可能です。
『Get-History』コマンドレットの実行履歴のID番号が3のコマンドを再度実行したいときは、以下コマンドを実行してください。
1 2 3 | Invoke-History 3 #または &(Get-History -Id 3) |
開始時間や終了時間を含む詳細な実行履歴の情報を取得する方法
過去に実行したPowerShellのコマンドについて、開始時間や終了時間を含む詳細な実行履歴の情報を取得したい場合には、『Get-History | Format-Table * -AutoSize』という形式のコマンドを実行します。
このコマンドを実行することで、以下のような結果が取得されます。
1 2 3 4 5 6 7 8 9 10 11 | PS C:\> Get-History | Format-Table * -AutoSize Id CommandLine ExecutionStatus StartExecutionTime EndExecutionTime -- ----------- --------------- ------------------ ---------------- 1 Set-Location "c:\" Completed 2019/10/28 11:50:46 2019/10/28 11:50:46 中略 11 Get-DnsClientCache Completed 2019/10/28 11:50:52 2019/10/28 11:50:52 PS C:\> |
実行結果中のExecutionStatusは実行ステータスを表し、『Completed』や『Stopped』といった結果が取得されます。
またStartExecutionTimeが実行開始時間を、EndExecutionTimeが実行終了時間を表しています。
コマンドの実行履歴を削除する方法
『Get-History』コマンドレットで取得できる実行履歴を削除したいときは、以下コマンドを実行してください。
1 | Clear-History |
尚、『Clear-History』コマンドレットを実行した直後に『Get-History』コマンドレットを実行すると、『Clear-History』コマンドレットの実行履歴のみが表示されます。
以前のPowerShellセッションで実行したコマンドの実行履歴を取得する方法
実は『Get-History』コマンドレットで取得できる実行履歴は、現在実行中のPowerShellセッションで入力されたコマンドのみです。
これについては、MicrosoftさんのDocsでも以下のように言及されています。
The Get-History cmdlet gets the session history, that is, the list of commands entered during the current session.
そのため、以前のセッションで実行したコマンドの履歴を『Get-History』コマンドレットで取得することはできません。
ですがPowerShellのコマンドの実行履歴は、テキストファイルにも保管されており、このファイルには以前のセッションで実行したコマンドも記録されています。
実行履歴が保管されているファイルのパスは、『(Get-PSReadlineOption).HistorySavePath』というコマンドを実行することで取得できます。
1 2 3 | PS C:\> (Get-PSReadlineOption).HistorySavePath C:\Users\test\AppData\Roaming\Microsoft\Windows\PowerShell\PSReadLine\ConsoleHost_history.txt PS C:\> |
※上記コマンドは、ユーザー『test』でログインした環境で実行しています。
したがって以前のセッションで実行したコマンドの履歴を含んだ、PowerShellのコマンドの実行履歴を取得したいときは『Get-Content』コマンドレットを併用し、以下のようなコマンドを実行すると良いでしょう。
1 2 3 4 5 6 7 8 9 10 11 | PS C:\> Get-Content (Get-PSReadlineOption).HistorySavePath (Get-PSReadlineOption).HistorySavePath Set-Location "c:\" Get-Location Get-HotFix Get-ComputerInfo 中略 Get-Content (Get-PSReadlineOption).HistorySavePath PS C:\> |
以上、参考になさってくださーい!