2

Так что у меня проблема.

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

send-mailmessage -to "$alertRecipient" -from "$alertSender" -subject "$alertSubject" -body "$alertBody" -smtpServer "$smtpServer"

Теперь я использовал много значений переменных в этой команде, и все они работают в некоторой степени. Я в основном смотрю на $alertSubject и $alertBody . Значения обеих этих переменных извлекаются из другого файла .txt и оба равны «$ selHost is offline!».

$selHost - это переменная, которую я использую в скрипте, чтобы она равнялась имени хоста, над которым работает скрипт в любой момент времени. Если я сделаю write-host $selHost любом месте скрипта, я получу что-то вроде «SomeComputerName» или «192.168.1.123», и его значение меняется каждый раз, когда скрипт переключается на следующий хост.

Я хочу, чтобы буквенное значение $selHost было в теле сообщения оповещения при его отправке, но, как я его написал, когда отправляется оповещение, он просто говорит: «$ selHost находится в автономном режиме!» давая мне совершенно бесполезный уровень понимания природы потенциальной проблемы.

Вставьте ссылку на мой скрипт, как сейчас.

Команда Send-Mail-Message в строке 30, $selHost определена в строке 23, $alertSubject определена в строке 10, $alertBody определена в строке 12.

TL; DR: я хочу встроить значение переменной в аргументы команды Send-MailMessage , но вместо этого я просто получаю имя переменной и не знаю, что делать.

2 ответа2

1

это то, что я использую в одном из моих сценариев. Попробуйте убрать переменные из кавычек.

Send-MailMessage -From $From -To $To -Subject $Subject -SmtpServer $SMTPServer -BodyAsHtml

Кроме того, какую версию PowerShell вы используете, так как я думаю, что Send-MailMessage версии v2 и выше.

$PSVersionTable.PSVersion
1

Поэтому, если я правильно читаю сценарий (и понимаю ваше описание), у вас есть две переменные: $alertSubject и $selHost

Обе эти переменные заполняются из текстовых файлов (config.txt и hosts.txt соответственно.)

Я предполагаю, что строка config.txt, которая заканчивается в переменной субъекта, буквально набрана как: $ selHost вне форума!

Проблема в том, что когда PowerShell читает этот файл, он обрабатывает строку как буквально строку. Там не происходит расширение Varibale.

У вас есть два варианта решения этой проблемы:

Вариант 1: объявить тему после получения имени хоста

Вы могли бы сделать что-то вроде этого:

$selHost = (GET-CONTENT $runPath\hosts.txt)[$it]
$alertSubject = "$selHost is offline!"

Это расширит переменную, и вы получите ожидаемый результат.

В качестве альтернативы, если вы все еще хотите получить основную часть темы из вашего файла config.txt, я бы предложил изменить ее на «$ selHost is offline!"чтобы" вне форума!"(обратите внимание на пробел в начале.)

Вы могли бы написать это как:

$alertSubject = (get-content $runPath\config.txt)[1] # You can leave this on line 10
# ...
$selHost = (GET-CONTENT $runPath\hosts.txt)[$it]
$alertSubjectSend = $selHost + $alertSubject # Use this 'send' variable in the Send-MailMessage cmdlet call

Это объединит две строки в одну.

Вариант 2. Используйте метод замены

Send-MailMessage -To $alertRecipient -From $alertSender -Subject ($alertSubject.Repalce('$selHost', $selHost)) -Body $alertBody -SmtpServer $smtpServer

В фокусе: -Subject ($alertSubject.Repalce('$selHost', $selHost))

Обратите внимание, мы ищем замену '$selHost' (буквальная строка, одинарные кавычки важны, чтобы переменная не раскрывалась). Мы хотим заменить его на $selHost (значение, хранящееся в переменной, без кавычек, поэтому оно расширяется, хотя вы можете использовать двойные кавычки, если хотите).

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

Вы также можете пойти с сохранением во временную переменную; метод тоже:

$alertSubjectSend = $alertSubject.Repalce('$selHost', $selHost)

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .