PowerShell スクリプトを使用してログファイルに出力を書き込む方法

PowerShellスクリプトの動作を素早く追跡したい場合は、シンプルなテキストファイルにログを記録するのが便利です。複雑なスクリプトをデバッグする場合でも、単にアクションの記録を残したい場合でも、これらの方法は非常に役立ちます。ただし、デフォルトの方法は基本的なもので、タイムスタンプなどの高度な機能は含まれていないため、少し面倒に感じることがあります。それでも、急いでいる場合や簡単なスクリプトを作成する場合は、手軽なログ記録には便利です。

コンテンツ:

PowerShell ターミナル出力をログファイルにリダイレクトする

コマンド出力を取得したいだけなら、最も簡単な方法はまたはのような演算子と>>や のようなコマンドを使うことです。これらの方法は高速ですが、タイムスタンプやコンテキストは記録されません。少々生々しいですが、特定のコマンドの記録だけが欲しい場合には有効です。Add-ContentOut-File

  • リダイレクトは>>出力をログファイルに直接追加します。例:
Write-Output "Files are successfully created in $env:COMPUTERNAME" >> C:\PS\Logs\TestLog.txt
  • 注:Set-Content必要に応じて、実行ごとにファイルを上書きすることができます。

あるいは、Add-Contentは と似ています>>が、より簡単にスクリプト化できます。

Add-Content -Path C:\PS\Logs\TestLog.txt -Value "Files are successfully created in $env:COMPUTERNAME"

さらに凝ったことをしたい場合(または単にスクリプト内でstd出力をリダイレクトしたい場合)、次のようにします。

Some-Command | Out-File -FilePath C:\PS\Logs\TestLog.txt -Append

これらの行はそれぞれ、コマンドが生成した内容をログに追加するだけです。かなり単純ですが、タイムスタンプの付与や複数エントリの処理は、別途スクリプトに記述しない限り、適切に行われませんので注意してください。

実行ごとにファイル全体を新しいログに置き換えたい場合は、Set-Content以前のデータが消去されるため、注意して使用してください。

Set-Content -Path C:\PS\Logs\TestLog.txt -Value "New log start at $(Get-Date)"

少し注意点があります。これらの方法ではタイムスタンプが自動的に追加されないため、アクションがいつ記録されたのか分からなくなることがあります。この点が気になる場合は、次の方法の方が適しているでしょう。

PowerShell スクリプトにログ機能を追加する

スクリプトを書いていて、タイムスタンプ付きのログが欲しい場合は、こちらの方がよりエレガントな方法です。これはトラブルシューティングには必須です。基本的には、ログファイルにタイムスタンプとメッセージを追加するちょっとした関数を追加するだけで、よりクリーンでプロフェッショナルな見た目になります(まあ、ある程度は)。

以下は、スクリプトにコピーして貼り付けることができる簡単な例です (パスを好みに合わせて調整するだけです)。

$LogFile = "C:\PS\Logs\$($env:COMPUTERNAME)_posh.log" function Write-Log { Param ([string]$LogString) $Stamp = (Get-Date).ToString("yyyy/MM/dd HH:mm:ss") $LogMessage = "$Stamp $LogString" Add-Content -Path $LogFile -Value $LogMessage -Encoding UTF8 }

これがなぜ役立つのか?それは、すべてのメッセージにタイムスタンプが付与され、Write-Log "message"スクリプト全体にタイムスタンプを散りばめることができるため、何がいつ発生したかを簡単に追跡できるからです。特に、進行状況の追跡が重要な長いスクリプトでは、非常に便利です。

使用例:

Write-Log "Script started" # do work Write-Log "Calculating..." Start-Sleep -Seconds 20 # more work Write-Log "Script completed"

この方法では、ログ ファイルにタイムスタンプ付きのエントリが記録されるため、デバッグやレビューの混乱が大幅に軽減されます。

ログの増加を監視したい場合は、次のコマンドを実行します。

Get-Content -Path $LogFile -Tail 10 -Wait

これは、最後の 10 件のエントリをリアルタイムでストリーミングします。進行状況をライブで監視している場合に非常に便利です。

Start-Transcript による PowerShell の自動ログ記録

さて、次は組み込みの、いわば「設定して忘れる」方式です。PowerShellはStart-Transcript実行されたコマンド、出力、エラーなど、すべてをキャプチャし、単一のログファイルに保存します。これは、独自のログ関数を書いたり、出力を手動でリダイレクトしたりするのが面倒な場合に最適です。

ログ記録を開始するには、次のコマンドを実行します。

Start-Transcript -Path C:\PS\Logs\MyTranscript.txt

次のコマンドを実行するまで、すべてのコマンドと結果がログに記録されます。

Stop-Transcript

設定によっては、少し不安定だったり、管理者権限がないと起動しなかったりする場合もありますが、一般的には非常に信頼性が高いです。また、 を使って特定のフォルダを指定することもできます-Path

上書きするのではなくログを追加する場合は、以下を追加します-Append:

Start-Transcript -Path C:\PS\Logs\PSScriptLog.txt -Append

これは、すべて同じログに書き込む複数のスクリプトを実行する場合に適しています。

さらに、これらをスクリプトに埋め込むこともできます。最初にトランスクリプトを開始し、作業を実行し、最後に停止すると、実行中に発生したすべての包括的な記録が得られます。

ログが失われることを心配な場合は、「コンピューターの構成」>「管理用テンプレート」>「Windows コンポーネント」>「Windows PowerShell」のグループポリシー設定で、 「PowerShell トランスクリプションを有効にする」をオンにしてください。有効にすると、Windows がすべての PowerShell アクティビティを自動的にログに記録するようになり、スクリプトは必要ありません。また、レジストリ設定を変更することもできますが、正直なところ、ほとんどの場合、ポリシー設定が最も簡単な方法です。

Windows は物事を複雑にする傾向があるため、これらのログはすぐに蓄積される可能性があります。そのため、長期的なセットアップの場合は、ログのサイズとローテーションを管理することをお勧めします。

全体的に見て、シンプルなリダイレクト、便利なログ機能、あるいは完全なトランスクリプトなど、PowerShellには様々な選択肢があります。最適な方法は、クイックログ、詳細なタイムスタンプ、あるいは完全なコマンド履歴など、何を求めているかによって異なります。