使用Out-GridView输出时排序失效问题求助
问题原因及解决方案
核心原因
你当前的脚本里,findstr输出的是纯文本行,并非PowerShell可识别的结构化对象:
Sort-Object(Sort是它的别名)的"Date"参数是用来按对象的Date属性排序的,但这些纯字符串没有这个属性,所以Sort实际是按字符串本身的字典序排序,而非你期望的日期值排序。- 即便按字符串排序,
wevtutil输出的日期文本格式(比如Date: MM/DD/YYYY HH:MM:SS)的字典序和实际日期顺序可能不一致,导致你看起来结果没按预期倒序。
最优解决方案:用PowerShell原生命令处理
直接使用Get-WinEvent查询日志,它会返回结构化的事件对象,能直接按时间属性准确排序:
Get-WinEvent -FilterHashtable @{ LogName='Security' ID=@(4800,4801) } | Sort-Object TimeCreated -Descending | Select-Object TimeCreated, Id, Message | Out-GridView
这个脚本会:
- 查询安全日志中ID为4800(锁屏)和4801(解锁)的事件
- 按事件创建时间倒序排列
- 只显示时间、事件ID和消息字段,输出到网格视图
保留wevtutil的替代方案
如果一定要用wevtutil,需要先把文本转换成带日期属性的对象,再排序:
wevtutil qe Security /q:"*[System[(EventID=4800 or EventID=4801)]]" /f:Text | ForEach-Object { # 匹配日期行并提取日期字符串 if ($_ -match 'Date:\s*(.*)') { [PSCustomObject]@{ # 把字符串转换成DateTime类型,确保排序准确 Date = [DateTime]$matches[1] OriginalLine = $_ } } } | Sort-Object Date -Descending | Select-Object OriginalLine | Out-GridView
内容的提问来源于stack exchange,提问作者NVerret
相关产品推荐
相关产品推荐

