我需要从这个命令的输出中提取一个特定的数字:
Get-EventLog "application" | Where-Object {$_.EventID -eq 6006}示例输出为:
Index Time EntryType Source InstanceID Message
----- ---- --------- ------ ---------- -------
18297 May 15 18:49 Warning Wlclntfy 2147489654 The winlogon notification subscriber <Profiles> took 60 second(s) to handle the notification event (Logon).
11788 Jan 31 08:11 Warning Wlclntfy 2147489654 The winlogon notification subscriber <Profiles> took 68 second(s) to handle the notification event (Logon).
5794 Oct 16 09:41 Warning Wlclntfy 2147489654 The winlogon notification subscriber <Sens> took 225 second(s) to handle the notification event (Logoff).
5596 Oct 11 08:03 Warning Wlclntfy 2147489654 The winlogon notification subscriber <Profiles> took 69 second(s) to handle the notification event (Logon).
2719 Aug 30 07:50 Warning Wlclntfy 2147489654 The winlogon notification subscriber <Profiles> took 65 second(s) to handle the notification event (Logon).我实际需要做的是提取<Profiles>事件报告的秒数,并提取出最大的一个。到目前为止,我已经知道(?<=<Profiles> took )(\d+)可以提取我需要的数字,但我不确定如何继续实际提取它们。我尝试通过管道将其传递给Select-String -pattern,但结果什么也没有返回。
发布于 2013-05-26 07:49:14
您需要$matches内置变量。$matches[0]是与正则表达式匹配的文本,$matches[1] .. $matches[n]是匹配的括号表达式(如果有)。遗憾的是,我的机器上没有任何EventID=6006,所以我在没有测试的情况下这样做,但这应该会从排序后的秒列表中选择最后一项:
Get-EventLog "application" |
Where-Object {$_.EventID -eq 6006} |
Where-Object { $_.Message -match "<Profiles> took (\d*) second" } |
foreach { [int]$matches[1] } |
sort |
select -last 1发布于 2013-05-26 14:49:47
您可以在不使用正则表达式的情况下获得值。看一下事件的ReplacementStrings属性。它包含一个保存事件条目中存储的替换字符串的数组。
PS> $event.ReplacementStrings
Profiles
71
Logon在此基础上,您可以使用数组索引来获取您想要的值。
Get-EventLog application |
Where-Object {$_.EventID -eq 6006 -and $_.ReplacementStrings -eq 'Profiles'} |
Foreach-Object { $_.ReplacementStrings[1] }https://stackoverflow.com/questions/16754448
复制相似问题