Есть ли способ выполнить команду из строки или иметь более одного тела в письме PowerShell? - PullRequest
0 голосов
/ 22 февраля 2020

Я пытаюсь отправить электронное письмо, содержащее как некоторую информацию, которую я печатаю, так и содержимое текстового файла, созданного в предыдущем коде. Мне было интересно, есть ли удобный способ сделать это без отправки двух электронных писем? Приведенный ниже код не работает, но я могу получить сообщение для отправки, если у меня есть только текст или только содержимое TXT-файла. Спасибо!

Send-MailMessage -SMTPServer localhost -To myemail@email.com -From myemail@email.com -Subject "TESTING Active Domain Replication Failure TESTING" -Body "The following Domain Controller has had a replication failure. Please see attached txt files for more information. `n"(Get-Content -Path .\causeOfFailure.txt | out-string) -attachment error.zip

Поэтому я отредактировал заявление так, чтобы оно выглядело следующим образом:

$fileContent = (Get-Content -Path .\causeOfFailure.txt)
compress-archive -Path causeOfFailure.txt,dnsInformation.txt -update -DestinationPath error.zip
Send-MailMessage -SMTPServer localhost -To email@email.com -From email@email.com -Subject "TESTING Active Domain Replication Failure TESTING" -Body "The following Domain Controller has had a replication failure. Please see attached txt files for more information. `n & $ExecutionContext.InvokeCommand.ExpandString($fileContent)" -attachment error.zip

В сообщении электронной почты показано это сообщение

"System.Management.Automation.EngineIntrinsics.InvokeCommand.ExpandString (Source Controller:".

Есть ли лучший способ, чтобы строка, сопровождаемая функцией, являлась частью тела письмо с командой send-mailmessage?

Ответы [ 2 ]

0 голосов
/ 23 февраля 2020

Проблема заключается в том, как вы строите строку тела.

У вас уже есть содержимое causeOfFailure.txt в переменной $fileContent, поэтому нет необходимости выполнять Get- Содержимое в том же файле снова.

Я бы посоветовал вам сначала создать свое тело в отдельной переменной, чтобы сделать код более читабельным. Для этого есть несколько вариантов, например

Использовать Here-String

$body = @"
The following Domain Controller has had a replication failure. Please see attached txt files for more information.

$fileContent
"@

Или вставить NewLine, а затем $fileContent, используя -f Оператор форматирования

$body = 'The following Domain Controller has had a replication failure. Please see attached txt files for more information.{0}{1}' -f
        [Environment]::NewLine, $fileContent

Или просто создайте в виде одной строки в двойных кавычках

$body = "The following Domain Controller has had a replication failure. Please see attached txt files for more information.`r`n$fileContent"

Какой бы метод поиска вы ни считали / поддерживал в вашем коде.

Затем для части, в которой вы используете командлет Send-MailMessage.

Здесь снова выписывание всех параметров в виде одной длинной строки может сделать код менее читабельным, и при этом ошибки легко сделали. Есть лучший способ использовать командлет с большим количеством параметров, известный как Splatting .
Применительно к вашему коду это выглядит следующим образом:

# create a hashtable object with all parameters you want to use for Send-MailMessage
$mailParams = @{
    SMTPServer  = 'localhost'
    To          = 'myemail@email.com'
    From        = 'myemail@email.com'
    Subject     = "TESTING Active Domain Replication Failure TESTING"
    Body        = $body
    Attachments = 'error.zip'
}

Send-MailMessage @mailParams

Надеюсь, это поможет

0 голосов
/ 22 февраля 2020

Если вы пытаетесь добавить содержимое файла в тело письма, вы можете просто использовать $ () для включения функций в кавычки.

Send-MailMessage -SMTPServer localhost -To email@email.com -From email@email.com -Subject "TESTING Active Domain Replication Failure TESTING" -Body "The following Domain Controller has had a replication failure. Please see attached txt files for more information. `n $fileContent" -attachment error.zip

Если вы хотите включить функция в вашем скрипте, вы можете сделать это,

Send-MailMessage -SMTPServer localhost -To email@email.com -From email@email.com -Subject "TESTING Active Domain Replication Failure TESTING" -Body "The following Domain Controller has had a replication failure. Please see attached txt files for more information. `n $(Get-Content -Path .\causeOfFailure.txt)" -attachment error.zip
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...