Windows PowerShellで実行ログを残す方法|標準出力・標準エラーやトランスクリプト活用まで解説

Windows

「PowerShellで何を実行したかあとから確認したい」
「エラーが出たときに原因を追跡したい」
そんなときに役立つのが 実行ログ です。

PowerShellには標準出力をファイルにリダイレクトする方法や、コマンド履歴やエラーも含めてログに残すトランスクリプト機能があります。

この記事では、Windows PowerShellでの実行ログ取得の基本から応用まで、初心者にもわかりやすく解説します。

スポンサーリンク

標準出力をログファイルに書き出す基本

> で上書き、>> で追記

PowerShellでは >>> を使って簡単にログを残せます。

基本的な出力リダイレクト

Get-Process > C:\logs\process.log

これで現在のプロセス一覧が process.log に保存されます。すでに同名ファイルがあれば上書きされます。

追記したいときは >> を使用

Get-Process >> C:\logs\process.log

既存のファイルに新しい内容を追加します。

Out-Fileコマンドでより詳細な制御

Get-Process | Out-File -FilePath C:\logs\process.log -Encoding UTF8

Out-File を使うと文字エンコーディングなども指定できます。

リダイレクト演算子の種類

PowerShellでは複数の出力ストリームがあります:

  • 1> : 標準出力(成功メッセージ)
  • 2> : 標準エラー(エラーメッセージ)
  • 3> : 警告メッセージ
  • 4> : 詳細メッセージ
  • 5> : デバッグメッセージ
  • 6> : 情報メッセージ
  • *> : すべての出力ストリーム

標準エラーも含めてログを取る方法

標準出力 + 標準エラーをまとめてログに

処理結果だけでなく、エラーもログに残したい場合の方法を紹介します。

PowerShell 5.1 まで

Get-Content nofile.txt > C:\logs\all.log 2>&1

これで標準出力も標準エラーも all.log に記録されます。

PowerShell 7 以降

PowerShell 7 では * を使って全ての出力をまとめられます。

Get-Content nofile.txt *> C:\logs\all.log

エラーのみを別ファイルに保存

Get-Content nofile.txt > C:\logs\output.log 2> C:\logs\error.log

標準出力とエラーを別々のファイルに保存することも可能です。

PowerShellのTranscript機能で実行ログをまるごと記録

Start-Transcriptの基本的な使い方

PowerShellには実行したコマンドとその結果、さらにエラーも含めてすべてテキストファイルに記録できる便利な機能 Start-Transcript があります。

基本的な使い方

Start-Transcript -Path C:\logs\session.log

これで以降のコマンド実行と結果がすべて session.log に記録されます。

ログの終了

Stop-Transcript

これでログ取りを終了します。

自動的に日付入りファイル名で保存

$date = Get-Date -Format "yyyyMMdd_HHmmss"
Start-Transcript -Path "C:\logs\session_$date.log"

Transcriptのパラメータ詳細

Start-Transcript -Path C:\logs\session.log -Append -IncludeInvocationHeader
  • -Append: 既存ファイルに追記
  • -IncludeInvocationHeader: 詳細なヘッダー情報を含める
  • -Force: 読み取り専用ファイルでも上書き

実行ログの活用例

トラブルシューティングで原因調査

スクリプトが思ったように動かないとき、ログを見ればどの時点でエラーになったかが一目瞭然です。

Start-Transcript -Path C:\logs\debug.log

# ここで問題のあるコマンドを実行
Get-ChildItem C:\nonexistent\folder
Copy-Item source.txt destination.txt

Stop-Transcript

定期ジョブのログ記録

タスクスケジューラでPowerShellスクリプトを自動実行する際の例:

# スクリプトの冒頭に追加
$logFile = "C:\logs\scheduled_task_$(Get-Date -Format 'yyyyMMdd').log"
Start-Transcript -Path $logFile -Append

try {
    # メインの処理
    Write-Host "処理開始: $(Get-Date)"
    
    # 実際の業務処理をここに記述
    Get-ChildItem C:\data | Measure-Object
    
    Write-Host "処理完了: $(Get-Date)"
}
catch {
    Write-Error "エラーが発生しました: $_"
}
finally {
    Stop-Transcript
}

スクリプト実行のエビデンス記録

重要な作業の実行証跡として:

$evidenceFile = "C:\evidence\maintenance_$(Get-Date -Format 'yyyyMMdd_HHmmss').log"
Start-Transcript -Path $evidenceFile

Write-Host "=== システムメンテナンス開始 ==="
Write-Host "実行者: $env:USERNAME"
Write-Host "実行日時: $(Get-Date)"

# メンテナンス作業
Get-Service | Where-Object Status -eq "Stopped"
Get-EventLog -LogName System -Newest 10

Write-Host "=== システムメンテナンス完了 ==="
Stop-Transcript

高度なログ設定

カスタムログ関数の作成

function Write-CustomLog {
    param(
        [string]$Message,
        [string]$LogPath = "C:\logs\custom.log",
        [ValidateSet("INFO", "WARN", "ERROR")]
        [string]$Level = "INFO"
    )
    
    $timestamp = Get-Date -Format "yyyy-MM-dd HH:mm:ss"
    $logEntry = "[$timestamp] [$Level] $Message"
    
    Add-Content -Path $LogPath -Value $logEntry
    Write-Host $logEntry
}

# 使用例
Write-CustomLog -Message "処理を開始します" -Level "INFO"
Write-CustomLog -Message "警告メッセージです" -Level "WARN"
Write-CustomLog -Message "エラーが発生しました" -Level "ERROR"

ログローテーション機能

function Start-LogWithRotation {
    param(
        [string]$LogPath,
        [int]$MaxSizeMB = 10
    )
    
    if (Test-Path $LogPath) {
        $file = Get-Item $LogPath
        $sizeMB = $file.Length / 1MB
        
        if ($sizeMB -gt $MaxSizeMB) {
            $backupPath = $LogPath -replace "\.log$", "_backup_$(Get-Date -Format 'yyyyMMdd').log"
            Move-Item $LogPath $backupPath
        }
    }
    
    Start-Transcript -Path $LogPath
}

Transcriptのメリット・デメリット

メリット

  • 何のコマンドをいつ実行したかまで残る
  • 標準出力・標準エラーがまとめてログになる
  • エビデンスや手順の証跡として便利
  • セッション全体の記録が可能
  • PowerShellの内部動作も記録

デメリット

  • ログが長くなる(大量のコマンドを実行すると巨大ファイルになる)
  • 対話形式のコマンド(パスワード入力など)は伏字にならず見えてしまう場合がある
  • 大量の出力があるコマンドでは処理が重くなる可能性
  • バイナリファイルの内容は正しく記録されない

よくある質問

Q: ログファイルが大きくなりすぎる場合の対策は?

A: ログローテーション機能を使ったり、必要な部分だけログに記録するように調整しましょう。

# 重要な部分のみログ記録
Start-Transcript -Path C:\logs\important.log
# 重要な処理のみ
Stop-Transcript

# 詳細ログは別途
Start-Transcript -Path C:\logs\detail.log
# 詳細な処理
Stop-Transcript

Q: パスワードなどの機密情報がログに残らないようにするには?

A: 機密情報を扱う前後でTranscriptを停止・再開するか、ログを暗号化しましょう。

Start-Transcript -Path C:\logs\session.log
# 通常の処理

Stop-Transcript
# パスワード入力など機密処理
$credential = Get-Credential

Start-Transcript -Path C:\logs\session.log -Append
# 続きの処理

Q: エラーだけを抽出してログに残すには?

A: Try-Catch文と組み合わせて、エラー専用のログを作成できます。

$errorLog = "C:\logs\error_$(Get-Date -Format 'yyyyMMdd').log"

try {
    # 処理内容
    Get-Content "nonexistent.txt"
}
catch {
    $errorMessage = "$(Get-Date): エラー発生 - $_"
    Add-Content -Path $errorLog -Value $errorMessage
}

まとめ

Windows PowerShellでは、以下の方法で様々な実行ログを残すことができます:

  • >>> で処理結果を簡単にログ化
  • 2>&1*> で標準出力・エラーをまとめて保存
  • Start-Transcript でコマンド履歴から結果までフルログを取得
  • カスタム関数でより詳細なログ制御
  • ログローテーションで容量管理

コメント

タイトルとURLをコピーしました