2016-05-15 53 views
0

我試圖根據它的ErrorRecord.CategoryInfo.Category枚舉值來處理錯誤。在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)" } 
    } 
} 

爲什麼不代碼執行,而不是default開關ErrorCategory.InvalidType開關?

Referencing system.management.automation.dll in Visual Studio的接受答案表明我需要安裝system.management.automation組件。

有沒有辦法測試$_.CategoryInfo.Category而無需安裝此程序集?

+0

我看不出鏈接的問題是如何相關的。 'System.Management.Automation.dll'是PowerShell的核心。你只需要引用它就可以在C#/ VbScript中使用PowerShell –

回答

3

它不起作用的原因是因爲[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)" } 
}