从Windows事件日志中查询进程ID(PID)

时间:2019-05-01 22:32:47

标签: windows powershell

我正在尝试编写一个查询,该查询将从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

1 个答案:

答案 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+”。