Home
1008 words
5 minutes
【PowerShell】Write-Errorコマンドによるエラー処理の実装

最終更新:2025-03-29

概要#

Write-ErrorはPowerShellでエラーメッセージを生成するためのコマンドレットである。スクリプトやコマンドの実行中に問題が発生した場合に、エラーストリームにメッセージを出力して利用者に通知することができる。通常のコンソール出力と異なり、エラーとして明示的に扱われるため、エラーハンドリングやログ記録などの自動化処理に適している。

基本的な使い方#

単純なエラーメッセージの出力#

最も基本的な使い方は、エラーメッセージを指定するだけである。

Write-Error "設定ファイルが見つかりません。"

エラーカテゴリの指定#

エラーの種類をカテゴリとして指定することができる。

Write-Error -Message "ファイルへのアクセスが拒否されました。" -Category PermissionDenied

エラーIDの指定#

エラーを識別するためのIDを指定することができる。

Write-Error -Message "データベース接続エラー" -ErrorId "DB001"

例外オブジェクトの指定#

特定の例外に関連付けたエラーを出力することができる。

$exception = [System.InvalidOperationException]::new("操作が無効です。")
Write-Error -Exception $exception

応用的な使い方#

ターゲットオブジェクトの指定#

エラーの原因となったオブジェクトを指定することができる。

$problematicObject = Get-Item "C:\temp"
Write-Error -Message "アクセス権限がありません" -TargetObject $problematicObject

カスタムエラーレコードの作成#

詳細なエラー情報を持つエラーレコードを作成できる。

$errorRecord = [System.Management.Automation.ErrorRecord]::new(
    [System.Exception]::new("カスタムエラー"),
    "CustomError001",
    [System.Management.Automation.ErrorCategory]::InvalidOperation,
    $null
)
Write-Error -ErrorRecord $errorRecord

Try-Catchブロック内でのエラー処理#

try-catchブロック内でエラーを適切に処理する例である。

try {
    # 何らかの処理
    $result = 10 / 0  # ゼロ除算エラー
} catch {
    Write-Error -Message "計算中にエラーが発生しました: $_" -Category InvalidOperation
}

カテゴリ別のエラー処理#

異なるエラーカテゴリを使い分けることで、適切なエラーハンドリングが可能になる。

function Test-ErrorCategories {
    param (
        [string]$FilePath,
        [int]$Value
    )
    
    if (-not (Test-Path $FilePath)) {
        Write-Error -Message "ファイル '$FilePath' が存在しません。" -Category ObjectNotFound
        return
    }
    
    if ($Value -lt 0) {
        Write-Error -Message "値 '$Value' は正の数でなければなりません。" -Category InvalidArgument
        return
    }
    
    # 正常処理
}

ハンズオン:Write-Errorの実践#

以下は一連のWrite-Errorコマンドとその出力例である。

  1. 基本的なエラーメッセージ
Write-Error "これは基本的なエラーメッセージです。"

出力例:

Write-Error: これは基本的なエラーメッセージです。
    + CategoryInfo          : NotSpecified: (:) [Write-Error], WriteErrorException
    + FullyQualifiedErrorId : Microsoft.PowerShell.Commands.WriteErrorException
  1. エラーカテゴリの指定
Write-Error -Message "ファイルが見つかりません" -Category ObjectNotFound

出力例:

Write-Error: ファイルが見つかりません
    + CategoryInfo          : ObjectNotFound: (:) [Write-Error], WriteErrorException
    + FullyQualifiedErrorId : Microsoft.PowerShell.Commands.WriteErrorException
  1. エラーIDの指定
Write-Error -Message "無効な操作です" -ErrorId "InvalidOp001"

出力例:

Write-Error: 無効な操作です
    + CategoryInfo          : NotSpecified: (:) [Write-Error], WriteErrorException
    + FullyQualifiedErrorId : InvalidOp001,Microsoft.PowerShell.Commands.WriteErrorException
  1. 例外オブジェクトの使用
$exception = [System.ArgumentNullException]::new("param1")
Write-Error -Message "null引数が検出されました" -Exception $exception

出力例:

Write-Error: null引数が検出されました
    + CategoryInfo          : NotSpecified: (:) [Write-Error], ArgumentNullException
    + FullyQualifiedErrorId : System.ArgumentNullException,Microsoft.PowerShell.Commands.WriteErrorException
  1. ターゲットオブジェクトの指定
$targetObj = "問題のあるデータ"
Write-Error -Message "データの検証に失敗しました" -TargetObject $targetObj

出力例:

Write-Error: データの検証に失敗しました
    + CategoryInfo          : NotSpecified: (問題のあるデータ:String) [Write-Error], WriteErrorException
    + FullyQualifiedErrorId : Microsoft.PowerShell.Commands.WriteErrorException
  1. カスタムエラーレコードの使用
$errorRecord = [System.Management.Automation.ErrorRecord]::new(
    [System.Exception]::new("ネットワーク接続が切断されました"),
    "NetworkError001",
    [System.Management.Automation.ErrorCategory]::ConnectionError,
    $null
)
Write-Error -ErrorRecord $errorRecord

出力例:

Write-Error: ネットワーク接続が切断されました
    + CategoryInfo          : ConnectionError: (:) [], NetworkError001
    + FullyQualifiedErrorId : NetworkError001
  1. エラー変数への格納
Write-Error "エラーを変数に格納" -ErrorVariable myError
$myError | Format-List * -Force

出力例(最初のエラーメッセージの後):

PSMessageDetails      : 
Exception             : Microsoft.PowerShell.Commands.WriteErrorException: エラーを変数に格納
TargetObject          : 
CategoryInfo          : NotSpecified: (:) [Write-Error], WriteErrorException
FullyQualifiedErrorId : Microsoft.PowerShell.Commands.WriteErrorException
ErrorDetails          : 
InvocationInfo        : System.Management.Automation.InvocationInfo
ScriptStackTrace      : at <ScriptBlock>, <No file>: line 1
PipelineIterationInfo : {}
  1. Try-Catchブロックでのエラーハンドリング
try {
    # エラーを発生させる
    throw "強制的なエラー"
} catch {
    Write-Error -Message "処理中にエラーが発生しました: $_" -Category OperationStopped -ErrorAction Continue
    Write-Host "エラー後の処理を継続します" -ForegroundColor Yellow
}

出力例:

Write-Error: 処理中にエラーが発生しました: 強制的なエラー
    + CategoryInfo          : OperationStopped: (:) [Write-Error], WriteErrorException
    + FullyQualifiedErrorId : Microsoft.PowerShell.Commands.WriteErrorException

エラー後の処理を継続します

対応PowerShellバージョン#

Write-Errorコマンドレットは以下のPowerShellバージョンで利用可能である:

  • Windows PowerShell 1.0以降
  • PowerShell Core 6.0以降
  • PowerShell 7.0以降

参考サイト#

【PowerShell】Write-Errorコマンドによるエラー処理の実装
https://ss0832.github.io/posts/20250329_write-error-powershell/
Author
ss0832
Published at
2025-03-29