PowerShell でログを取る方法はいくつかあります。
方法の使い分け
| 方法 | 向いている用途 |
|---|---|
| Start-Transcript | 手動操作の記録・デバッグ |
| Write-Log 関数 | 本番スクリプトのログ管理 |
| エラーのみ記録 | 定期実行タスクのエラー監視 |
| Out-File / Export-Csv | コマンド結果の保存・集計 |
| イベントログ | システム管理・監査ログ |
目次
セッション全体の入出力をファイルに記録する(Start-Transcript)
TeraTermのログのように、作業中のログが保存できます。
# ログ開始
Start-Transcript -Path "C:\logs\session.log"
# ここで実行したコマンドがすべて記録される
Get-Service
Get-Process
# ログ終了
Stop-Transcript
また、スクリプトの先頭と末尾に入れて全操作が記録することもできます。
コマンド結果をファイルに保存する
# 上書き保存
Get-Service | Out-File "C:\logs\services.log"
# 追記
Get-Service | Out-File "C:\logs\services.log" -Append
# CSV で保存(Excel で開ける)
Get-Service | Export-Csv "C:\logs\services.csv" -Encoding UTF8 -NoTypeInformation
スクリプト内でファイルに書き出す
$logFile = "C:\logs\app.log"
function Write-Log {
param([string]$Message, [string]$Level = "INFO")
$timestamp = Get-Date -Format "yyyy/MM/dd HH:mm:ss"
$line = "[$timestamp] [$Level] $Message"
Add-Content -Path $logFile -Value $line
Write-Host $line
}
# 使い方
Write-Log "処理を開始します"
Write-Log "エラーが発生しました" -Level "ERROR"
Write-Log "処理が完了しました"
```
ログファイルの中身:
```
[2026/03/16 10:00:00] [INFO] 処理を開始します
[2026/03/16 10:00:01] [ERROR] エラーが発生しました
[2026/03/16 10:00:02] [INFO] 処理が完了しました
エラーだけ記録する
try {
Get-Service "存在しないサービス" -ErrorAction Stop
}
catch {
$timestamp = Get-Date -Format "yyyy/MM/dd HH:mm:ss"
Add-Content -Path "C:\logs\error.log" -Value "[$timestamp] ERROR: $($_.Exception.Message)"
}
Windows イベントログに記録する
# イベントログへ書き込む
Write-EventLog -LogName Application `
-Source "MyScript" `
-EventId 1001 `
-EntryType Information `
-Message "スクリプトが正常に完了しました"
# イベントログを確認
Get-EventLog -LogName Application -Source "MyScript" -Newest 10
まとめ
定期実行スクリプトには 方法2(Write-Log関数)+ 方法3(エラー記録) の組み合わせが最も実用的です。