Сценарий почтового сообщения Powershell

#email #powershell #send

#Адрес электронной почты #powershell #Отправить

Вопрос:

У меня проблема со сценарием.

Каждую ночь планировщик задач сервера запускает пакет, который создает журнал, на каких компьютерах он не смог обновить. Затем этот сценарий PS извлекает журнал ошибок и отправляет электронное письмо с уведомлением о компьютерах. Файл журнала ошибок представляет собой текстовый файл, и имя файла меняется каждый день, чтобы отразить дату, например, 10172016.txt .

Я могу отправить скрипт по электронной почте, и он использовался для извлечения файла журнала и размещения его в его теле; но теперь он пустой и показывает ошибку, касающуюся » «.

Код:

 clear

$smtpserver = "test.test.org"

$from="noreply@test.org"

$to="adamh@test.org"

$subject="Update Error Log for"   " "   (get-date -format d)

$message = (Get-Content -path "\testserverDepartmentsITPrivatetestlogs"   "(get-date -f mmddyyyy)"   ".txt" | Out-String )

$mailer = new-object Net.Mail.SMTPclient($smtpserver)

$msg = new-object Net.Mail.MailMessage($from,$to,$subject,$body)

$msg.IsBodyHTML = $false

$mailer.send($msg)
  

Пожалуйста, помогите.

Ответ №1:

Существует (по крайней мере) проблема с вашим кодом, а именно (упрощенная команда):

 Get-Content -path "pathto"   "(get-date -f MMddyyyy)"   ".txt"
  

Это должно быть (обратите внимание на заключающие скобки и отсутствие двойных кавычек вокруг get-date команды):

 Get-Content -path ("pathto"   (get-date -f MMddyyyy)   ".txt")
  

В PowerShell есть два основных режима синтаксического анализа — режим аргументов и режим выражения, и важно понимать, какой из них применяется, когда это важно:
см Get-Help about_Parsing .

Короче говоря: без (...) PowerShell видит "pathto" (get-date -f MMddyyyy) ".txt" 5 отдельных аргументов, а не одну синтезированную строку.


В качестве альтернативы можно использовать одну строку в двойных кавычках с интерполяцией строк, использующую оператор подвыражения, $(...) , для встраивания get-date вызова:

 Get-Content -path "pathto$(get-date -f MMddyyyy).txt"
  

Дополнительные замечания:

  • Собственный язык Send-MailMessage доступен с версии PowerShell 3.

  • Строка формата для 2-значных месяцев — это MM , а не mm (последнее — минуты).

  • Хотя использование синтаксиса псевдометода new-object Net.Mail.MailMessage($from,$to,$subject,$body) работает, его лучше избегать, потому что он может маскировать неправильное представление о том, как New-Object работает: правильная форма New-Object Net.Mail.MailMessage -ArgumentList $from,$to,$subject,$body ; как вы можете видеть, поскольку вы имеете дело с командлетом, он использует режим аргументов.

Комментарии:

1. Вы разгадали загадку. Спасибо! Это была смесь обоих ваших предложений.

2. @AdamHerrera: Рад это слышать. Каким образом вам пришлось использовать смесь? Я добавил еще несколько примечаний к ответу.