在 PowerShell 中将数组的一个元素与前一个元素进行比较

在 PowerShell 中将数组的一个元素与前一个元素进行比较

有人能描述一个好的模式来比较 $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

这显示了给定日志间隔内唯一消息的数量。

相关内容