Назад | Перейти на главную страницу

Сравните элемент массива с предыдущим элементом в 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-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

Это показывает количество уникальных сообщений в заданном интервале журнала.