关于排序和管道的 PowerShell 问题

PowerShell question with sorting and piping

您好,我使用的是 PowerShell 版本 5 我是 运行 一个命令,它正在运行,但缩小的搜索没有返回结果。

Get-EventLog System -Newest 5 | where {$_.eventID -eq 1074}

所以我想哦,我只想查看与我的过滤器匹配的最后 5 个对象。它运行但 returns 没有结果,因为在事件日志中,最后 5 个条目中没有 eventID 1074。所以我只需要将该参数移到最后。运气不好

Get-EventLog System | where {$_.eventID -eq 1074} | -newest 5

-newest : The term '-newest' is not recognized as the name of a cmdlet, function, script file, or operable program. Check 
the spelling of the name, or if a path was included, verify that the path is correct and try again.
At line:1 char:53
+ Get-EventLog System | where {$_.eventID -eq 1074} | -newest 5
+                                                     ~~~~~~~
    + CategoryInfo          : ObjectNotFound: (-newest:String) [], CommandNotFoundException
    + FullyQualifiedErrorId : CommandNotFoundException

因此,将 -newest 定位在管道后将参数移动到我认为不理解的位置。

任何人对我如何思考这个问题有一些建议,这对我将来有帮助吗?

要将您的 筛选的 结果限制为最多 5 个事件,您必须在最终管道段中使用 Select-Object -First 5

Get-EventLog System | Where-Object { $_.eventID -eq 1074 } | Select-Object -First 5

-Newest <n>Get-EventLog特有的参数,它无条件returns第一个<n>条目,无论其内容如何。

没有 common parameter across cmdlets that offers similar functionality, but there's the generic Select-Object cmdlet 允许通过 -First <n> 从任何输入中选择最多 <n> 个对象。

这里有一种可能更快捷的方式来获取您似乎想要的信息。它使用 Get-WinEvent 而不是 Get-EventLog 并且还使用 -FilterHashtable 参数让事件系统进行一些过滤。

#requires -RunAsAdministrator

$FilterHash = @{
    Logname = 'System'
    ID = 1074
    StartTime = (Get-Date).AddDays(-20)
    }
Get-WinEvent -FilterHashtable $FilterHash -MaxEvents 20

通常 明显比使用 Get-EventLog 快。 [咧嘴一笑]

这里有一篇关于想法的文章...

使用 FilterHashTable 通过 PowerShell 过滤事件日志 – 你好,脚本专家!博客
https://blogs.technet.microsoft.com/heyscriptingguy/2014/06/03/use-filterhashtable-to-filter-event-log-with-powershell/