在 PowerShell 中测试 ErrorRecord.CategoryInfo.Category

Test ErrorRecord.CategoryInfo.Category in PowerShell

我正在尝试根据其 ErrorRecord.CategoryInfo.Category 枚举值处理错误。

代码:

try {
    # assembly not installed on workstation
    [Reflection.Assembly]::LoadWithPartialName('Oracle.DataAccess')
    # throws error with a category of 'InvalidType'
    $connection = New-Object Oracle.DataAccess.Client.OracleConnection($ConnectionString)
    $Connection.Open()

}
catch {
    # generates 'DEBUG: CategoryInfo.Category: InvalidType'
    write-debug "CategoryInfo.Category: $($_.CategoryInfo.Category)"

    # generates 'DEBUG: Category: InvalidType' (the `default` switch)
    switch ($_.CategoryInfo.Category) {
        [ErrorCategory.InvalidType] {Write-Debug "InvalidType"}
        [ErrorCategory.InvalidOperation] {Write-Debug "InvalidOperation"}
        default { write-Debug "Category: $($_.CategoryInfo.Category)" }
    }
}

为什么代码不执行 ErrorCategory.InvalidType 开关,而不是 default 开关?

接受的 Referencing system.management.automation.dll in Visual Studio 答案表明我需要安装 system.management.automation 程序集。

有没有无需安装此程序集即可测试 $_.CategoryInfo.Category 的方法?

它不起作用的原因是 [ErrorCategory.InvalidType] 不是使用枚举的 PowerShell 语法。

您可以直接指定枚举值(名称)并让 PowerShell 对其进行转换,也可以直接访问枚举。例如:

switch ($_.CategoryInfo.Category) {
    InvalidType {Write-Debug "InvalidType"}
    ([System.Management.Automation.ErrorCategory]::InvalidOperation) {Write-Debug "InvalidOperation"}
    default { write-Debug "Category: $($_.CategoryInfo.Category)" }
}