#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: Рад это слышать. Каким образом вам пришлось использовать смесь? Я добавил еще несколько примечаний к ответу.