如何为 'get-eventlog' 注册活动?

How to register an event for 'get-eventlog'?

我需要注意我的 Windows 7 事件日志中的特定错误 - 是否有单行代码可以做到这一点?

因此:例如 - 我正在注意 'disk' 错误;这样我就可以通过执行以下操作来获取最新事件:

get-eventlog system  -source "disk" -after ([datetime]::Today)

(这是另一个 Post 的答案,事实上:

但很明显,我必须保留 运行 这个以随时了解任何警报。

这不是严格意义上的单行,但您想要的是 tail 事件日志,您可以使用 PowerShell 使用以下命令执行此操作:

$lastCheck = [DateTime]::Now.Date
while ($true) {
  Get-EventLog System -Source "disk" -After $lastCheck -ErrorAction SilentlyContinue
  $lastCheck = [DateTime]::Now.DateTime
  Start-Sleep 1
}

如果你更进一步并将它包装在一个函数中,然后它变成一个单行代码:

function Tail-EventLog ($source) {
  $lastCheck = [DateTime]::Now.Date
  while ($true) {
    Get-EventLog System -Source $source -After $lastCheck -ErrorAction SilentlyContinue
    $lastCheck = [DateTime]::Now.DateTime
    Start-Sleep 1
  }
}

你可以执行的是:

Tail-EventLog "disk"

您可以将其放入您的 PowerShell Profile 以确保它始终可供您使用。

没有单行。但是,您可以使用 System.Diagnostic.EventLog class 并注册到 EntryWritten 事件 [=26=,而不是 轮询 事件日志] 使用 Register-ObjectEvent cmdlet。

这里是我注册到应用程序日志并在回调中输出消息的示例:

$eventLog = New-Object System.Diagnostics.EventLog "application"
$eventLog.EnableRaisingEvents = $true
$job = Register-ObjectEvent -InputObject $eventLog -EventName "EntryWritten" -Action { Write-Host ($eventArgs.Entry.Message) } 
Receive-Job $job

您现在可以使用以下方法测试回调:

$eventLog.Source = "test"
$eventLog.WriteEntry("test")

这会将 test 输出到控制台。