Powershell: как выполнить поиск по Select-String с -Exclude для нескольких строк текста в другом файле

Проект: у меня есть файл журнала, который постоянно добавляется. В этот файл журнала иногда добавляется ошибка (ошибка всегда включает "Невозможно импортировать" и уникальный идентификатор). Я должен быть предупрежден по электронной почте, когда эта ошибка добавлена ​​в файл журнала.

Текущее состояние проекта: у меня есть скрипт (он должен запускаться каждые 15 минут), сканирующий файл журнала с помощью Select-String, и если он находит эту ошибку, он добавляет его в отдельный текстовый файл с именем alert-(Get-Date).txt. В конце сценария PS файл alert.txt отправляется мне по электронной почте.

Проблема: новый файл журнала создается ежедневно, поэтому мой скрипт просматривает только этот файл. Проблема состоит в том, что, как только он находит ошибку, каждое последующее сканирование посылает мне предупреждение об ошибках, о которых я уже знаю. Я хочу, чтобы последующие оповещения содержали только НОВЫЕ ошибки.

Текущая попытка решить проблему Вот как выглядит пример ошибки в файле журнала:

 1/29/2015 13:38:45 1/29/2015 13:38:45  Sales Order User Import     Unable to import OHDR_2785_228038_01292015.txt due to required files missing. Files are being removed from current directory to suspense directory.

Я добавил в скрипт средства для извлечения уникального идентификатора ошибки в лог-файл. В данном случае это 2785. Этот идентификатор и другие идентификаторы ошибок добавляются в другое имя текстового файла oldAlerts.txt. Итак, содержимое выглядит так:

2785
1182
1353
1555

Я хочу добавить в свой сценарий способ исключить эти строки для результатов Select-String. Вот мой Select-String до сих пор:

Get-ChildItem \txtforerp\Import\Log | Where{$_.LastWriteTime -gt (Get-Date)-$ts -AND $_.LastWriteTime -lt (Get-Date)} | select-string -Pattern "Unable to import" | Out-File $path\"$alert.txt" 

Как использовать идентификаторы в файле oldAlert.txt в качестве фильтра, чтобы гарантировать, что в предупреждение будут добавлены только новые ошибки. Я открыт для использования других подходов, если мой не лучший метод.

1 ответ

Решение

Я бы предложил использовать прогноз с отрицательным утверждением, чтобы исключить любую строку, о которой уже сообщалось. Кроме того, должно быть легко идентифицировать новые идентификаторы с помощью Select-String:

Get-ChildItem \txtforerp\Import\Log | Where{ $_.LastWriteTime -gt (Get-Date)-$ts } | 
    Select-String "Unable to import OHDR_(?!$($ids -join '|'))(\d{4})" | 
    Select-Object Filename, Line, { $_.Matches.Groups[1].Value }

В этом коде $ids представляет список ранее идентифицированных идентификаторов. Кстати, я удалил эту проверку:

$_.LastWriteTime -lt (Get-Date)

Не представляется разумным проверить, не были ли файлы изменены в будущем...?

Другие вопросы по тегам