尝试将变量传递给 Send-MailMessage 参数,但失败了

尝试将变量传递给 Send-MailMessage 参数,但失败了

所以我有一个问题。

我正在尝试编写一个脚本,该脚本可以 ping 外部 .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 处于离线状态!”,这完全无法帮助我洞察潜在问题的本质。

现在这是我的脚本的 Pastebin 链接。

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

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

答案1

因此,如果我正确阅读了脚本(并理解了你的描述),则有两个变量,$alertSubject并且$selHost

这两个变量均由文本文件(分别是 config.txt 和 hosts.txt)填充。

我假设 config.txt 中以主题变量结尾的行实际上是输入为:$selHost 处于离线状态!

问题是,当 PowerShell 读取该文件时,它会将字符串视为字面上的字符串。那里没有进行变量扩展。

您有两个选择可以轻松解决此问题:

选项 1:获取主机名后声明主题

你可以做这样的事情:

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

这将扩展变量并最终得到您所期望的输出。

或者,如果您仍然想从 config.txt 文件中获取大部分主题,我建议将其从“$selHost 处于离线状态!”更改为“处于离线状态!”(请注意开头的空格。)

你可以将其写成:

$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(存储在变量中的值,没有引号,所以它会扩展,尽管你可以使用双引号。)替换它。

整个内容用括号括起来,以便首先评估这一小块内容,然后将结果传递给 cmdlet。

您也可以采用“将其保存到临时变量中”的方法:

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

答案2

这是我在其中一个脚本中使用的。尝试将变量从引号中取出。

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

另外,我认为 Send-MailMessage 是 v2 及以上版本,所以您正在运行哪个版本的 powershell。

$PSVersionTable.PSVersion

相关内容