Может ли кто-нибудь описать хороший образец для сравнения $ 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-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
Один из этих двух методов должен помочь вам получить уникальную коллекцию, которую вы ищете.
Вы можете попробовать:
$entry | sort-object -unique
$entry | sort-object -property TimeWritten
(если это подходящее поле).
Идея состоит в том, чтобы избавиться от дубликатов, а затем вернуть их в исходный порядок.
Справка для Group-Object в Poweshell имеет очень похожий пример:
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
Это показывает количество уникальных сообщений в заданном интервале журнала.