Привет, я только начал осваивать 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
Объяснение изменений
-
Регулярные выражения: Я изменил использование строки для поиска на обычное совпадение с помощью
-SimpleMatch
. Это убирает необходимость в использовании регулярных выражений, которые могут вызывать ошибки, если не корректно написаны. -
Сохранение результатов: Теперь результаты поиска сохраняются в файл с помощью
Set-Content
. - Отправка почты: Используются именованные параметры для упрощения изменений, если это потребуется в будущем. Убедитесь, что указаны правильные адреса для отправителя и получателя, а также корректный SMTP сервер.
Заключение
Этот скрипт должен корректно выполнять вашу задачу: искать строки в логах, сохранять найденные результаты в текстовом файле и отправлять его на указанный адрес электронной почты. Протестируйте его и дайте знать, если у вас возникнут дополнительные вопросы!