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
命令的参数中,但我只是得到了变量的名称而我不知道是什么做。
答案 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)