適材適所

PowerShellやVBAなどプログラミング系の話多めで

PowerShellでログを取る(Strat-Transcript/Stop-Transcript)

PowerShellを使って通信機器等と戯れていると、

「あれ?あのときどんなコマンド打ったんだっけ?」

「ちゃんと手順書通り実行したぞ。でも証跡がないと不安。」

そんなとき、画面コピーをとるなんて前近代的なことはしたくない!

というか、手作業でいちいち記録に残すのは面倒!

そんなときは、PowerShellの便利コマンドレットの

「Start-Transcript/Stop-Transcript」を使うととっても便利。

個人的に便利だと思う点

自分の好きなタイミングでログを取ることができる

ログを取るタイミングを自分で始められるのは地味に便利。

ログを開始するときは

Start-Transcript

終了するときは

Stop-Transcript

で終了することができます。

「とりあえず、どんなログも残しておきたい・・・」

なんて人は、PowerShellのprofileを使えば

Start-Transcriptを仕込むことで、

自動でログを残すことも可能です。

ファイル名が一意になるよう、よしなに設定してくれる!

痒い所に手が届く仕様ですね。

PS C:> Start-Transcript
トランスクリプトが開始されました。出力ファイル: C:\PowerShell_transcript.<<PC名>>.yUcdGATx.20210209133530.txt

私の環境では、「PowerShell_transcript.<<PC名>>.<<適当な文字列>>.yyyyMMddhhmmss.txt」という形式でファイルが作成されました。

これでログファイルが意図せず上書きされた!!なんてことがなくなってみんな幸せです。

実行環境まで含めてファイルに出力してくれる!

**********************
Windows PowerShell トランスクリプト開始
開始時刻: 20210209122845
ユーザー名: xxxxx
RunAs ユーザー: xxxxx
構成名:
コンピューター: xxxx (Microsoft Windows NT 10xxxxx)
ホスト アプリケーション: C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe
プロセス ID: 18812
PSVersion: xxxx
PSEdition: Desktop
PSCompatibleVersions: xxx
BuildVersion: xxxx
CLRVersion: xxxx
WSManStackVersion: xxx
PSRemotingProtocolVersion: xxx
SerializationVersion: xxxxx
**********************

どのPCで、どのユーザーで、PowerShellのVersionがこれで・・・

と、後で欲しくなりそうな情報を付加してくれるところがいぶし銀です。

その他、便利(?)なパラメータ

-append

既存のログファイルに追記することができます。

-OutputDirectory

ログファイルを保存するフォルダを指定することができます。

-IncludeInvocationHeader

このパラメタを指定すると、ログファイルにコマンド開始時のタイムスタンプが付与されます。

**********************
コマンド開始時刻: 20210209134637
**********************
PS C:> Stop-Transcript
**********************

証跡を残すのに、これでもかというくらい付与して、上長に提出してやるといい感じですね。

まぁ所詮テキストファイルなので偽装は可能ですが。

-NoClobber

出力先に指定したファイルが既に存在した場合、上書きをせずに、エラーとするパラメータ。

既に存在するファイルを指定してStart-Transcript -noclobberで実行すると・・・

「ファイル~は既に存在しますが、NoClobber が指定されました。」

と出てエラーとなります。

Start-Transcript : ファイル C:\ログ.txtは既に存在しますが、NoClobber が指定されました。
発生場所 行:1 文字:1
+ Start-Transcript -Path 'C:\Users\LNX2144\Documents\PowerShell_transcr ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo: ResourceExists: (C:\Users\LNX214...10209133530.txt:String) [Start-Transcript], Unautho
rizedAccessException
+ FullyQualifiedErrorId : NoClobber,Microsoft.PowerShell.Commands.StartTranscriptCommand

NoClobberが指定されましたってなんでそこだけ英語なんだ・・・。

ちなみにClobberとは上書きするという意味だそうです。

他のプログラム(cmdやOpenSSHなど)が出力されない問題

大変便利なStart-Transcriptですが、ひとつ困った問題が。

他のプログラムを実行した結果がログに残らない・・・。

これが大事なのに。

この問題、Out-Defaultコマンドにパイプすることで回避できます。

ssh 192.168.1.1|Out-Default

sshはOpenSSHのコマンドです。

外部プログラムの出力はデフォルトだと標準出力に出ないということでしょうか。

コンソールで見ていると同じように見えますが。

細かいことはわかりませんが、色々あるのでしょう・・・。

終わりに

個人的に好きなコマンドのひとつ、Start-Transcript/Stop-Transcript。

だっていぶし銀じゃないですか。便利だし。

ただし、-NoClobberのエラーだけは直してください。

以上、ここまでお読みいただき、ありがとうございました。

PowerShellのコマンドレットについて熱く語る関連記事

www.tekizai.net

www.tekizai.net