有人能描述一个好的模式来比较 $entry[X] 和 $entry[Y] 以确定它们是否相同吗?我正在尝试获取可读的日志摘要,但不想输出 400 行相同的内容。
foreach ($log in $logs) {
$nm = $log.LogDisplayName
$header = $log.LogDisplayName
Write-Host $header
Add-Content $output "$header Log Errors/Warnings, Past 48 Hours"
$entries = $log.Entries | ? {$_.TimeWritten -gt ($(Get-Date).AddDays(-2)) -and (($_.EntryType -like "Error") -or ($_.EntryType -like "Warning"))}
foreach ($entry in $entries) {
***here is where I think I need to compare array elements***
}
out-string -inputobject $entries | add-content $output
答案1
要将当前条目与前一个条目进行比较:
$preventry = ""
$newarray = $()
foreach ($entry in $entries) {
if ($entry -ne $preventry) { $newarray += @($entry) }
$preventry = $entry
}
结果数组$newarray
包含所有内容$entries
,但删除了相邻的重复项。
答案2
Select-Object 是完成这类任务的好帮手。
下面说明如何从字符串集合中消除所有重复项:
[123] PS↑ C:\> 'a','b','b','c','d','e','e','f','g' | Select-Object -Unique
a
b
c
d
e
f
g
但是,如果您正在使用具有多个属性的对象,那么如果对象的字符串表示对于每个对象都相同,这将不会有太大帮助(例如,Get-Service | Select-Object -Unique 返回一个对象,因为所有服务对象在转换为字符串时都会转换为 System.ServiceProcess.ServiceController,而字符串不能用于唯一地标识服务)。在这种情况下,您需要指定要检查哪个属性的唯一性。
这是另一个示例,向您展示如何获取当前目录中文件的唯一扩展名列表:
Get-ChildItem | Select-Object -Property Extension -Unique
这两种技术中的一种应该可以帮助您获得您正在寻找的独特收藏。
答案3
您可以尝试:
$entry | sort-object -unique
$entry | sort-object -property TimeWritten
(如果这是适当的字段)。
这个想法就是删除重复项然后将其恢复到原来的顺序。
答案4
Poweshell 中 Group-Object 的帮助有非常类似的例子:
get-eventlog -logname system -newest 1000 | group-object -property {$_.TimeWritten - $_.TimeGenerated}
您可以轻松交换一些参数:
Get-EventLog system -after (Get-Date).adddays(-2) | ?{($_.EntryType -like "Error") -or ($_.EntryType -like "Warning")} | group -property index | ?{$_.count -gt 1}
这将获取过去 48 小时内所有错误或警告的系统日志条目,并按其索引对其进行分组。这是为每个日志条目分配的唯一编号,您可以使用它来识别重复项。最后一部分只是过滤掉所有唯一的条目并保留重复的条目。
如果您想检查消息的唯一性,请使用以下命令:
Get-EventLog system -after (Get-Date).adddays(-2) | ?{($_.EntryType -like "Error") -or ($_.EntryType -like "Warning")} | group -property messages -noelement
这显示了给定日志间隔内唯一消息的数量。