捕获Get-EventLog错误

时间:2014-10-17 23:37:46

标签: powershell

我正在编写一个简单的脚本来解析一些事件日志,但是当没有结果或者instanceid无效时,我需要暂停一些错误:

PS C:\> get-eventlog Application -instanceid 1111

Get-EventLog : No matches found
At line:1 char:13
  + get-eventlog <<<<  Application -instanceid 1111
      + CategoryInfo          : ObjectNotFound: (:) [Get-EventLog], ArgumentException
      + FullyQualifiedErrorId : GetEventLogNoEntriesFound,Microsoft.PowerShell.Commands.GetEventLogCommand

我可以做到这一点并保持沉默,但这也会使其他错误沉默:

PS C:\> try { get-eventlog Application -instanceid 1111 -erroraction stop } catch { }

我试过了,但它没有用:

PS C:\> try { get-eventlog Application -instanceid 1111 -erroraction stop } catch [ObjectNotFound] { }

Unable to find type [ObjectNotFound]: make sure that the assembly containing this type is loaded.
At line:1 char:91
  + try { get-eventlog Application -instanceid 1111 -erroraction stop } catch [ObjectNotFound] <<<< { }
     + CategoryInfo          : InvalidOperation: (ObjectNotFound:String) [], RuntimeException
     + FullyQualifiedErrorId : TypeNotFound

3 个答案:

答案 0 :(得分:2)

绝不是唯一的选择,但你可以尝试这样的事情:

$result = get-eventlog Application -instanceid 1111 -erroraction silentlycontinue
if($result){
    Write-Host "Found some."
} else{
    Write-Host "wah wah wah waaaah... you know like the trombone sound"
}

再一次,我没有完全阅读帖子。为了更好地回答我的问题,我提供了这个可能会帮助您解决try阻碍问题

的问题
try {
    get-eventlog Application -instanceid 1111 -ErrorAction Stop
} Catch [Exception]{
    $theError = $_
    Switch($theError .Exception.GetType().FullName){
        System.InvalidOperationException{Write-Host "This happened: $($theError.Exception.Message)"}
        System.ArgumentException {Write-Host "This happened: $($theError.Exception.Message)"}
        default{"Something else happened: $($theError.Exception.GetType().FullName)"}
    }
}

使用-Stop创建终止错误。捕获任何异常并将错误对象放入变量中,以便以后可以在其他范围内使用。获取异常名称并在其上使用switch语句来确定适当的操作。在您的“未找到匹配项”的情况下会抛出[System.ArgumentException],您可以通过查看$_.Exception.GetType().FullName的值来判断。捕获switch语句中的特定错误,如果您还没有捕获到特定异常,则可以在default中看到详细信息。

当我在cmdlet调用“Fizgig”中替换“Application”时,它的值[System.InvalidOperationException]发生了什么

答案 1 :(得分:2)

您可以使用-ErrorAction SilentlyContinue并在其后检查$error变量,

$error[0] 

它将始终包含最后一个错误对象。

答案 2 :(得分:0)

在不停止脚本执行的情况下,您应该尝试使用以下语法来获取错误:

    try
    {
        # check for eventLog
        Get-EventLog -LogName "Application" -InstanceId 1111 -ErrorAction Stop
    }
    catch
    {
        # send error as ID
        Write-Warning "Error -Message $($_.Exception.Message) -Line $($_.InvocationInfo.ScriptLineNumber) -Time $(Get-Date -Format 'HH.mm.ss.fff')"
    }