💪

PowerShellでのオペレーションの記録

2024/12/01に公開

はじめに

PowerShellでは実行した処理の内容を履歴として確認する機能と、実行した処理の内容をファイルに出力する機能があります。これらの機能について紹介します。

処理の実行履歴

PowerShellではプロンプトで実行した処理の履歴を閲覧することができます。履歴として表示されるのは、PowerShellのコマンドレットだけではなく、Windowsの標準のコマンドも対象となります。

最も簡単な履歴の確認方法

プロンプトで上下のボタンを押すと、今まで実行したコマンドレットの履歴が新しい順に表示されます。表示されるコマンドレットの履歴は、今までに実行した全ての処理が対象になります。

複数個プロンプトを開いて履歴を表示した場合、別のプロンプトで実行したコマンドレットは履歴として表示されません。一回プロンプトを閉じて、新しいプロンプトを立ち上げた時に履歴を参照できるようになるようです。

複数個のプロンプトを立ち上げてオペレーションを行った時のコマンド実行履歴の順番の細かい仕様は分かりませんが、順番が時系列で保障されている訳ではないようです。

Get-Historyを利用する

Get-Historyのコマンドレットを使用することで、コマンドの実行履歴を閲覧することができます。実行履歴の表示対象は、セッション内で実行された処理になります。一回プロンプトを閉じると、Get-Historyで出力される履歴はクリアされます。

Get-Historyの実行時に count のオプションを利用することで、出力する件数を指定することができます。実行履歴が新しい順からcountで指定した件数だけ履歴を表示します。

> get-history -Count 4

  Id     Duration CommandLine
  --     -------- -----------
  11        0.302 Get-Service
  12        0.006 get-history -Count 4
  13        0.012 get-history -Count 4
  14        0.008 get-history -Count 4

IDの値が大きいほど新しい実行履歴になります。ここではIDが14なので、14回の処理が実行されていることが分かります。

なお、Get-Historyの出力のメンバを確認すると以下のようになります。

> get-history | Get-Member

   TypeName: Microsoft.PowerShell.Commands.HistoryInfo

Name               MemberType Definition
----               ---------- ----------
Clone              Method     Microsoft.PowerShell.Commands.HistoryInfo Clone()
Equals             Method     bool Equals(System.Object obj)
GetHashCode        Method     int GetHashCode()
GetType            Method     type GetType()
ToString           Method     string ToString()
CommandLine        Property   string CommandLine {get;}
Duration           Property   timespan Duration {get;}
EndExecutionTime   Property   datetime EndExecutionTime {get;}
ExecutionStatus    Property   System.Management.Automation.Runspaces.PipelineState ExecutionStatus {get;}
Id                 Property   long Id {get;}
StartExecutionTime Property   datetime StartExecutionTime {get;}

Get-Historyを実行したときに出力される Id、Duration、CommandLineの他にもいくつかプロパティが存在します。 Get-History の出力を全て表示させると以下のようになります。

> Get-History -Count 1 | Select-Object *

Id                 : 30
CommandLine        : Get-History -Count 1 | Select-Object *
ExecutionStatus    : Completed
StartExecutionTime : 2024/11/30 12:02:31
EndExecutionTime   : 2024/11/30 12:02:31
Duration           : 00:00:00.0058457

出力される内容は以下の通りです。

プロパティ名 標準での出力 内容
Id 出力される 実行された処理に振られる連番。
CommandLine 出力される 実行された処理の内容。
ExecutionStatus 出力されない 実行結果。エラーの場合、Failedになる。
StartExecutionTime 出力されない 処理を実行した日時。
EndExecutionTime 出力されない 処理が完了した日時。
Duration 出力される 処理にかかった時間。

これらのプロパティを参照することで、かなり細かいコマンドの実行履歴を確認することができます。

履歴が出力されるファイル

PowerShellで実行した処理は履歴ファイルに保存されます。履歴ファイルがどこにあるかは、以下のコマンドレットを実行することで確認できます。このファイルには、いままで実行したコマンドが全て記録されています。

> (Get-PSReadLineOption).HistorySavePath
<ユーザのディレクト>\AppData\Roaming\Microsoft\Windows\PowerShell\PSReadLine\ConsoleHost_history.txt

Windowsでは、ユーザのプロファイルのディレクトリ以下の\AppData\Roaming\Microsoft\Windows\PowerShell\PSReadLine\ConsoleHost_history.txt に保存されます。こちらを一時的に変更したい場合は、

 Set-PSReadLineOption -HistorySavePath [変更先のファイルパス]

で変更することができます。プロンプトを閉じると、履歴の保存先は元のパスのConsoleHost_history.txt に戻ります。

実行記録

PowerShellでは、Transcriptのコマンドレットを利用してオペレーションの記録を取ることができます。実際のコマンドレットは以下の二つになります。

> Get-Command -Noun transcript

CommandType     Name                                               Version    Source
-----------     ----                                               -------    ------
Cmdlet          Start-Transcript                                   7.0.0.0    Microsoft.PowerShell.Host
Cmdlet          Stop-Transcript                                    7.0.0.0    Microsoft.PowerShell.Host

記録の開始と終了

プロンプトでStart-Transcriptを実行します。実行すると、プロンプト上に出力先のファイルのパスとファイル名が表示されます。

> Start-Transcript
Transcript started, output file is [ユーザプロファイルのパス]\Documents\PowerShell_transcript.[ホスト名].[ハッシュ].[取得開始日時].txt

Windowsの場合、$HOME\Documents 、LinuxかMacの場合は $HOME にファイルが出力されます。記録を停止する時は、Stop-Transcriptを実行します。出力先のパスとファイル名が出力されて記録が終了します。出力先のファイルは、取得開始日時やランダムな値で既存のファイルと名前が被らないように新規作成されます。

PS C:\Users\Main> Start-Transcript
Transcript started, output file is  [ユーザプロファイルのパス]\Documents\PowerShell_transcript.[ホスト名].[ランダムな値].[取得開始日時].txt

出力先のファイルには、プロンプトに出力される内容がそのまま出力されます。実行した処理や出力される結果を記録することができます。出力先のファイルのヘッダーには、実行ユーザやホスト名、処理の開始と終了の日時が自動で挿入されます。

Start-Transcriptで利用できるオプション

Transcriptのコマンドレットで記録を取る時に条件付けをするときは、Start-Transcriptの実行時にオプションで指定します。利用できるオプションについては、Microsoftのヘルプで確認できます。

https://learn.microsoft.com/ja-jp/powershell/module/microsoft.powershell.host/start-transcript?view=powershell-7.4

出力先の変更のためのオプション

オプション名 内容
Path 出力されるパスとファイル名の指定
LiteralPath 出力されるファイル名とパスの指定
OutputDirectory 出力されるフォルダ、ディレクトリを指定。ファイル名は自動で振られる。

Path と LiteralPath では、ワイルドカードが利用できるかどうかの違いなどがあるようです。

なお、$Transcript の変数にあらかじめ出力先のパスとファイル名を指定しておくと、Start-Transcriptを実行時に $Transcript で指定されたファイルに実行記録を出力します。

出力するファイルへの書き込みを制御するオプション

オプション名 内容
Append このオプションをしていすると、既存のファイルに追記します。
NoClobber 出力されるファイルの上書きを禁止します。

いずれのオプションも、ファイル名やパスを指定した際に有効になります。これらを指定せずに Start-Transcript を実行すると、既存のファイルと名前が被らない形式で新規にファイルが作成されます。これらのオプションで指定するのは、ファイル名が被ったときの挙動になります。

出力される内容を制御するオプション

オプション名 内容
IncludeInvocationHeader 出力に処理の実行時刻が追記されます。
UseMinimalHeader 出力されるヘッダーの内容を簡素なものにします。

IncludeInvocationHeaderのオプションを利用すると、実行する処理の前の行に以下のような形式で実行時刻が出力されます。

**********************
Command start time: 20241201114335
**********************

UseMinimalHeaderのオプションを指定すると、ヘッダに記載される情報がTranscriptの開始時刻のみとなります。

Discussion