「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
でコマンド履歴から結果までフルログを取得- カスタム関数でより詳細なログ制御
- ログローテーションで容量管理
コメント