试图将变量传递给Send-MailMessage参数并且失败了

时间:2015-06-26 14:58:16

标签: email powershell command-line

来自SuperUser的

x-post

所以我有一个问题。

我正在尝试编写一个脚本,在外部.txt文件中ping主机名列表,如果其中一个出现故障,则会发送电子邮件警报。我遇到了一些问题,但现在的主要问题是,我无法找到一种方法将变量插入到消息的主题行或正文中。我用来发送到电子邮件提醒的代码现在看起来像这样:

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离线“让我对潜在问题的本质有一个完全无益的洞察力。

Pastebin link of my script as it is now.

第30行上的

Send-Mail-Message命令,第23行定义的$selHost,第10行定义的$alertSubject,第12行定义的$alertBody

TL; DR:我想将变量的值嵌入到Send-MailMessage命令的参数中,但我只是得到了变量的名称而我不知道是什么做。

1 个答案:

答案 0 :(得分:0)

您的问题与$selHost的价值无关。

从文本文件导入字符串时,即使它包含看起来像变量的内容,PowerShell也不会自动评估它。您需要手动进行评估(字符串扩展):

$alertSubject = (get-content $runPath\config.txt)[1]
$alertBody = (get-content $runPath\config.txt)[2]
...
# Don't to this immediately after string import. You need $selHost to be
# defined by the script first. Otherwise it'll evaluate to $null.
$alertSubject = $ExecutionContext.InvokeCommand.ExpandString($alertSubject)
$alertBody = $ExecutionContext.InvokeCommand.ExpandString($alertBody)