Powershell如何替换外部HTML文档中的占位符变量?
问题原因
Get-Content读取文件得到的是字面量字符串,PowerShell默认不会自动解析字符串内部的$变量标记;同时原代码的变量定义顺序错误,先读取HTML模板、后定义$Salutation变量,即使开启变量展开也无法匹配到对应值。
解决方案
方案1:直接展开模板变量(适合简单场景)
无需修改现有HTML模板,调整变量定义顺序,调用$ExecutionContext.InvokeCommand.ExpandString()方法即可自动解析模板内的所有变量标记。
修改后的脚本示例:
# 注意:必须先定义所有占位符对应的变量,再读取模板 $Salutation = "Foo Bar!" $MailBodyTemplate = Get-Content body.htm -Raw # 展开模板内的所有变量 $MailBody = $ExecutionContext.InvokeCommand.ExpandString($MailBodyTemplate) $MailMessageParam = @{ "Subject" = "Mail from Powershell!" "Encoding" = "UTF8" "Body" = $MailBody "BodyAsHtml" = $true } Send-MailMessage @MailMessageParam
方案2:显式替换占位符(更安全,适合复杂场景)
将模板内的占位符改为不易冲突的{{变量名}}格式,手动指定替换规则,避免模板内非变量的$内容被误解析。
修改后的body.htm示例:
<html> <body> <h1> Hello {{Salutation}}! </h1> </body> </html>
修改后的脚本示例:
$MailBodyTemplate = Get-Content body.htm -Raw $Salutation = "Foo Bar!" # 逐个替换对应占位符 $MailBody = $MailBodyTemplate -replace '\{\{Salutation\}\}', $Salutation $MailMessageParam = @{ "Subject" = "Mail from Powershell!" "Encoding" = "UTF8" "Body" = $MailBody "BodyAsHtml" = $true } Send-MailMessage @MailMessageParam
内容的提问来源于stack exchange,提问作者Gill-Bates
相关产品推荐
相关产品推荐

