我正在编写一个简单的脚本来解析一些事件日志,但是当没有结果或者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
答案 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')"
}