将数组的元素与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 

要比较当前条目和上一条:

 $preventry = "" $newarray = $() foreach ($entry in $entries) { if ($entry -ne $preventry) { $newarray += @($entry) } $preventry = $entry } 

结果数组$newarray包含$entries所有内容,但删除了相邻的重复项。

select对象是这种任务的朋友。

以下是如何消除string集合中的任何重复内容的方法:

 [123] PS↑ C:\> 'a','b','b','c','d','e','e','f','g' | Select-Object -Unique a b c d e f g 

如果您正在处理具有多个属性的对象,那么对于每个对象的对象的string表示forms都是相同的(例如,Get-Service | Select-Object -Unique将返回一个对象,因为所有服务对象转换为System.ServiceProcess.ServiceController转换为string时,不能用于唯一标识服务)。 在这种情况下,你需要指定你想检查哪个属性的唯一性。

下面是另一个例子,它展示了如何获取当前目录中文件的唯一扩展名列表:

 Get-ChildItem | Select-Object -Property Extension -Unique 

这两种技术之一应该可以帮助你获得你正在寻找的独特的collections。

你可以尝试:

 $entry | sort-object -unique $entry | sort-object -property TimeWritten 

(如果这是适当的领域)。

这个想法是摆脱重复,然后把它放回原来的顺序。

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 

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