尝试在一系列事件中仅读取消息的一小部分。无法获得良好的输出。
我的脚本(假设所有变量都已正确设置,我能够收集正确的事件,等等):
$Events = Get-WinEvent -ComputerName $Server -FilterHashtable @{LogName=$LogName;
StartTime=$StartTime} -ErrorAction SilentlyContinue
| Where-Object {$_.message -match "$Keyword1|$Keyword2"}
foreach ($Event in $Events)
{
$InStuff = $Event.Message
$InStuff = $InStuff.Split("`n").Trim("`r")
$Null = $InStuff.Where({$_ -match '<Message>(?<EventMessage>.+)</Message>'})
$EventMessage = $Matches.EventMessage
$Null = $InStuff.Where({$_ -match '\[Key\] : (?<EventKey>.+)'})
$EventKey = $Matches.EventKey
$EventXML = [xml]$Event.ToXml()
$EventArray = New-Object -TypeName PSObject -Property @{
EventID = $Event.Id
EventTime = $Event.TimeCreated
EventProvider = $Event.ProviderName
EventLog = $Event.LogName
EventMessage = $EventMessage
EventKey = $EventKey
}
$EventArray | Select EventTime,EventLog,EventProvider,EventID,EventMessage,EventKey
}
结果(注意,EventMessage为空):
EventTime : 7/30/2018 3:43:54 PM
EventLog : CCS
EventProvider : CCS Logging
EventID : 100
EventMessage :
EventKey : R-MD
但是...如果在我的脚本中执行此操作(手动从日志中粘贴摘录):
$InStuff = @'
Timestamp: 7/30/2018 3:43:54 PM
Message: <Description>An exception has been detected.</Description>
<DateTime>2018-07-30 11:43:54Z</DateTime>
<Message>Exception Message:No category found for key = R-MD.</Message>
[Key] : R-MD
[LocaleId] : 1033
'@
代替此:
$InStuff = $Event.Message
那我得到了很好的结果:
EventTime : 7/30/2018 3:43:54 PM
EventLog : CCS
EventProvider : CCS Logging
EventID : 100
EventMessage : Exception Message:No category found for key = R-MD.
EventKey : R-MD
如果有帮助,$Event.Message.GetType()
和$Event.Message[0].GetType()
会产生以下结果:
True | True | String | System.Object
True | True | Char | System.ValueType
基本上,要回顾一下,我需要:
<Message>
的{{1}}和</Message>
标记之间的任何内容$Event.Message
的值是什么(句子或3-4个字符)这两个东西似乎都位于[Key] :
内部。
我的实际日志中可能有多种不同的内容,因此特别不能针对X字符进行拆分等。这不是一种选择,到目前为止,我所管理的是Reddit或Internet上一些海报的帮助一般。我尝试了各种RegEx组合,但都无济于事,而且我似乎无法全神贯注于如何使用RegEx。
我已经花了12个小时的大部分时间,只是为了使他的输出正确无误...我很茫然。
请帮助!
====================
编辑:以下是每个请求的导出事件:
$Event.Message
答案 0 :(得分:1)
运行这条班轮让我从$ InStuff的<Message></Message>
之间得到了价值:
[regex]::matches($InStuff,'<Message>(.*?)<\/Message>').value.Replace("<Message>","")
.Replace("</Message>","").Trim()
输出:
Exception Message:No category found for key = R-MD.
对于[Key]值:
[regex]::matches($InStuff,'(?<=\[Key\]).*').value.Replace(":","").Trim()
输出:
R-MD
一个了解正则表达式的好网站是:https://regex101.com/,它们解释了正则表达式的每个部分在测试字符串上的作用。