我正在尝试编写一个查询,该查询将从Windows事件日志中提取进程ID (PID)。
我正在处理Windows事件ID:1309
我写了一些使我接近的脚本,但没有一个使我回到家。这是最接近的:
Get-EventLog -LogName Application -Source 'ASP.NET 4.0.30319.0' -EntryType Warning -Newest 1 |
where eventid -eq 1309 |
Select message |
Format-List |
Out-File c:\temp\elogdata.txt
Select-String c:\temp\elogdata.txt -Pattern "process id:" -SimpleMatch
这是我得到的输出:
C:\temp\elogdata.txt:20: Process ID: 7332
我需要将“ 7332”从“进程ID:”传送到另一个命令,例如TaskKill或ProcDump。
奇怪的是,当我尝试在内存中的输出上运行Select-String
时,我什么也没得到:
Get-EventLog -LogName Application -Source 'ASP.NET 4.0.30319.0' -EntryType Warning -Newest 1 |
where eventid -eq 1309 |
Select message |
Format-List |
Select-String -InputObject {$_} -Pattern "process id:"
我还尝试了几种Get-WinEvent
脚本...
Get-WinEvent -FilterHashtable @{LogName='application';ID='1309'} -MaxEvents 1 |
Format-List |
select message
答案 0 :(得分:0)
从不使用Format-*
cmdlet。您要做的是 expand Message
属性并调整您的模式,以便提取实际的PID而不是整行。您也不想在这里使用简单的匹配。
... |
Select-Object -Expand Message |
Select-String -Pattern '(?<=process id:\s+)\d+' |
Select-Object -Expand Matches |
Select-Object -Expand Value
($<=...)
是所谓的正向隐式断言,它使您可以匹配字符串中的某些内容,而不必将其包含在返回的匹配中。从本质上讲,该模式的意思是“只有在其他字符串之后才匹配\d+
”。