Проблемы со скриптом PowerShell для извлечения логов

Вопросы и ответы

Привет, я только начал осваивать PowerShell и работаю со следующим скриптом.
Моя конечная цель – просканировать несколько файлов ‘Log.txt’ на наличие строки:

TOTAL NUMBER OF MAILS SUCCESSFULY PROCESSED FOR USER [ [email protected] ]

и затем вывести результаты этой строки и другого текста на той же строке в текстовый файл, который мне нужно отправить.
Может кто-нибудь подсказать, где я ошибаюсь? Скрипт дает сбой на каждой попытке, хотя там есть текст. Например, строка будет выглядеть так:

TOTAL NUMBER OF MAILS SUCCESSFULY PROCESSED FOR USER [ [email protected] ] [55] 

Спасибо,
Пол

*# Определите путь к файлу журнала
$logFilePath = "H:\Playground\PowerShell\All\Logs\All*.log"
*# Определите строку для поиска
$SearchString = "*TOTAL NUMBER OF MAILS SUCCESSFULY PROCESSED FOR USER [ [email protected] ]*"
*# Выполните поиск в файле журнала
$result = Get-Content -Path $logFilePath | Select-String -Pattern $searchString
*# Определите путь для выходного файла
$outputFilePath = "H:\Playground\PowerShell\AcquireAll\Results\Res.txt"
Send-MailMessage -To "[email protected]" -From "[email protected]" -Subject "test" -Body "Смотрите во вложении" -Attachments "H:\Playground\PowerShell\AcquireAll\Results\Res.txt"  -SmtpServer "mymail.server.com"**

У вас некорректное регулярное выражение в строке $SearchString, ваш скрипт на самом деле должен выдавать ошибку:

Строка TOTAL NUMBER OF MAILS SUCCESSFULY PROCESSED FOR USER [ [email protected] ] не является корректным регулярным выражением: Неверный паттерн ‘TOTAL NUMBER OF MAILS SUCCESSFULY PROCESSED FOR USER [ [email protected] ]‘ на смещении 1.
Квантификатор ‘*’ следует за пустым.

Если вы ищете строки, которые совпадают точно:

TOTAL NUMBER OF MAILS SUCCESSFULY PROCESSED FOR USER [ [email protected] ]

Следующие или предшествующие любому другому тексту, вы можете использовать -SimpleMatch, а в паттерне указать строку для точного совпадения. Вы также можете использовать Select-String для чтения файлов, нет необходимости в Get-Content. Также кажется, что вы хотели сохранить результаты в файл, но не сделали этого, поэтому вы можете добавить Set-Content после.

$logFilePath="H:\Playground\PowerShell\All\Logs\All*.log"
# Определите строку для поиска
$SearchString = 'TOTAL NUMBER OF MAILS SUCCESSFULY PROCESSED FOR USER [ [email protected] ]'
# Определите путь для выходного файла
$outputFilePath="H:\Playground\PowerShell\AcquireAll\Results\Res.txt"
# Выполните поиск в файле журнала
Select-String -Path $logFilePath -Pattern $searchString -SimpleMatch |
    # и сохраните результаты здесь
    Set-Content $outputFilePath

$sendMailMessageSplat = @{
    To          = '[email protected]'
    From        = '[email protected]'
    Subject="тест"
    Body        = 'Смотрите во вложении'
    Attachments="H:\Playground\PowerShell\AcquireAll\Results\Res.txt"
    SmtpServer="mymail.server.com"
}

Send-MailMessage @sendMailMessageSplat

Ответ

Конечно! Давайте разберемся с вашим сценарием PowerShell и исправим его так, чтобы он работал согласно вашим требованиям.

Проблема

Вы встретили трудности с предоставленным сценарием. Основная проблема заключается в неправильном использовании регулярных выражений для поиска строк, а также отсутствием сохранения результатов в файл, который затем необходимо отправить по почте.

Решение

Вот исправленный скрипт, который будет искать указанную строку в файлах логов и сохранять результаты в текстовом файле:

# Определите путь к логу
$logFilePath = "H:\Playground\PowerShell\All\Logs\All*.log"

# Определите строку для поиска
$SearchString = 'TOTAL NUMBER OF MAILS SUCCESSFULY PROCESSED FOR USER [ <a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="9cddf8f1f5f2b2c8fdeff7dcf4f5effff3e4b2fff3f1">[email protected]</a> ]'

# Определите путь к выходному файлу
$outputFilePath = "H:\Playground\PowerShell\AcquireAll\Results\Res.txt"

# Выполните поиск в лог-файлах и сохраните результаты
Select-String -Path $logFilePath -Pattern $SearchString -SimpleMatch |
    Set-Content -Path $outputFilePath

# Подготовьте параметры для отправки почты
$sendMailMessageSplat = @{
    To          = 'recipient@example.com' # Укажите адрес получателя
    From        = 'sender@example.com'    # Укажите адрес отправителя
    Subject     = 'test'
    Body        = 'See attached'
    Attachments = $outputFilePath
    SmtpServer  = 'mymail.server.com'     # Укажите SMTP сервер
}

# Отправьте сообщение на почту с вложением
Send-MailMessage @sendMailMessageSplat

Объяснение изменений

  1. Регулярные выражения: Я изменил использование строки для поиска на обычное совпадение с помощью -SimpleMatch. Это убирает необходимость в использовании регулярных выражений, которые могут вызывать ошибки, если не корректно написаны.

  2. Сохранение результатов: Теперь результаты поиска сохраняются в файл с помощью Set-Content.

  3. Отправка почты: Используются именованные параметры для упрощения изменений, если это потребуется в будущем. Убедитесь, что указаны правильные адреса для отправителя и получателя, а также корректный SMTP сервер.

Заключение

Этот скрипт должен корректно выполнять вашу задачу: искать строки в логах, сохранять найденные результаты в текстовом файле и отправлять его на указанный адрес электронной почты. Протестируйте его и дайте знать, если у вас возникнут дополнительные вопросы!

Оцените материал
Добавить комментарий

Капча загружается...