Windows Server 2025 / 管理スクリプトにエラー処理と実行ログを入れる
コマンドが終わったことと、管理作業が成功したことは同じではありません。try、catch、finallyと実行ごとのログを使い、どの段階まで完了したかを残します。
捕捉できるエラーと処理の継続を理解する
この実習はファイルの読み取りとログ保存だけを行い、役割やサービスは変更しません。実運用の構成スクリプトでは、途中で失敗するまでに行った変更も記録が必要です。catchに入っても先行する変更が自動で戻るわけではありません。
PowerShellには処理が続くエラーもあります。try内に置くだけではすべて捕捉できないため、対応するコマンドでErrorAction Stopを使います。エラー処理の仕組みも確認してください。
入力ファイルとスクリプトを準備する
C:\LabScripts\input.txtにlab readyを一行保存します。次の完全な例を同じフォルダーのRead-LabFile.ps1へUTF-8で保存し、Windows PowerShell 5.1から実行します。
param(
[Parameter(Mandatory=$true)]
[string]$InputPath
)
$logDirectory = 'C:\LabLogs'
New-Item -ItemType Directory -Path $logDirectory -Force -ErrorAction Stop | Out-Null
$runLabel = (Get-Date -Format 'yyyyMMdd-HHmmss') + '-' + ([guid]::NewGuid().ToString('N').Substring(0,6))
$logPath = Join-Path $logDirectory ($runLabel + '.json')
$result = [ordered]@{
StartedAt = (Get-Date).ToString('o')
ComputerName = $env:COMPUTERNAME
InputPath = $InputPath
Success = $false
LineCount = $null
ErrorId = $null
ErrorMessage = $null
}
$exitStatus = 0
try {
$lines = @(Get-Content -LiteralPath $InputPath -ErrorAction Stop)
$result.LineCount = $lines.Count
$result.Success = $true
}
catch {
$result.ErrorId = $_.FullyQualifiedErrorId
$result.ErrorMessage = $_.Exception.Message
$exitStatus = 1
Write-Warning $result.ErrorMessage
}
finally {
$result.FinishedAt = (Get-Date).ToString('o')
$result | ConvertTo-Json | Set-Content -LiteralPath $logPath -Encoding UTF8 -ErrorAction Stop
}
Write-Output $logPath
exit $exitStatus
実行ごとに異なるJSONログを作成します。パスワード、トークン、不要な入力ファイルの内容をログへ含めない設計にします。
入力だけを変えて成功と失敗を比較する
missing-input.txtが本当に存在しないことを確認します。元の入力やシステムファイルを削除せず、呼び出すパスだけを変えます。
powershell.exe -NoProfile -File 'C:\LabScripts\Read-LabFile.ps1' -InputPath 'C:\LabScripts\input.txt'
$LASTEXITCODE
powershell.exe -NoProfile -File 'C:\LabScripts\Read-LabFile.ps1' -InputPath 'C:\LabScripts\missing-input.txt'
$LASTEXITCODE
各実行の直後に終了コードを確認します。想定は正常時が0とSuccess=true、存在しない入力が1とSuccess=falseです。表示された各JSONを開き、InputPathとErrorIdを比較します。実行ポリシーで止まる場合は組織の署名・承認手順に従います。
エラー処理とログの限界を確認する
| 部分 | この例の役割 |
|---|---|
| try | ファイルを読み、行数を記録 |
| catch | エラーの識別子とメッセージ、失敗の終了コードを記録 |
| finally | 読み取りの成否に関係なくログ保存を試行 |
try・catch・finallyの仕様を確認してください。finallyがあってもディスクの空きや書き込み権限は保証されないため、ログ出力も失敗を検出します。ログがないことを成功と解釈しません。
外部プログラムの非ゼロ終了は、Windows PowerShell 5.1で必ずcatchに入るとは限りません。LASTEXITCODEを直後に調べ、必要ならthrowします。別の外部コマンドで値が変わる前に確認してください。
運用向けに再実行条件を追加する
- 対象サーバー、処理対象、開始と終了時刻を残します。
- 既存状態を調べ、重複作成と意図しない上書きを防ぎます。
- 成功した処理、失敗した処理、復旧の範囲を分けて記録します。
正常な入力パスへ戻して再実行し、新しい成功ログを確認します。必要な証拠を残してから実習用ファイルだけを整理してください。SilentlyContinueでエラーを隠すことは、信頼できる処理にする方法ではありません。




