如何在PowerShell邮件脚本的JSON配置中实现变量替换
解决PowerShell JSON配置中变量无法替换的问题
问题根源
直接读取并解析JSON文件时,PowerShell不会自动识别JSON字符串里的$TaskTime、$ReleasedFeatures这类变量——JSON内容会被当作纯文本处理,变量名不会被替换为实际值。
解决方案
方法一:手动字符串替换(安全可控)
适合配置内容固定、占位符明确的场景,完全避免代码注入风险。
- 修改JSON配置(建议用自定义占位符替代
$开头的变量,避免混淆):
{ "To": "recipient@example.com", "Subject": "Release Notification - {{TaskTime}}", "Body": "New features released at {{TaskTime}}:\n{{ReleasedFeatures}}" }
- 编写PowerShell脚本实现替换:
# 定义实际业务变量 $TaskTime = Get-Date -Format "yyyy-MM-dd HH:mm:ss" $ReleasedFeatures = "- Feature 1: 新增用户权限管理`n- Feature 2: 优化数据导出功能" # 读取并解析JSON配置 $mailConfig = Get-Content -Path ".\mailConfig.json" -Raw | ConvertFrom-Json # 替换主题和正文中的占位符 $mailConfig.Subject = $mailConfig.Subject -replace '{{TaskTime}}', $TaskTime $mailConfig.Body = $mailConfig.Body -replace '{{TaskTime}}', $TaskTime -replace '{{ReleasedFeatures}}', $ReleasedFeatures # 发送邮件(按需补充发件人、SMTP服务器信息) Send-MailMessage -To $mailConfig.To ` -Subject $mailConfig.Subject ` -Body $mailConfig.Body ` -From "release-notify@example.com" ` -SmtpServer "smtp.example.com"
方法二:使用ExpandString自动解析变量(灵活但需注意安全)
如果需要自动识别所有PowerShell变量,可利用PowerShell的字符串解析能力,但仅当JSON配置来源完全可信时使用,否则存在代码注入风险。
# 定义实际业务变量 $TaskTime = Get-Date -Format "yyyy-MM-dd HH:mm:ss" $ReleasedFeatures = "- Feature 1: 新增用户权限管理`n- Feature 2: 优化数据导出功能" # 读取JSON原始文本(不提前解析为对象) $mailConfigRaw = Get-Content -Path ".\mailConfig.json" -Raw # 解析文本中的PowerShell变量 $parsedConfig = $ExecutionContext.InvokeCommand.ExpandString($mailConfigRaw) # 转换为JSON对象 $mailConfig = $parsedConfig | ConvertFrom-Json # 发送邮件 Send-MailMessage -To $mailConfig.To ` -Subject $mailConfig.Subject ` -Body $mailConfig.Body ` -From "release-notify@example.com" ` -SmtpServer "smtp.example.com"
两种方案对比
- 手动替换:安全可靠,适合固定占位符场景,需逐个处理变量。
ExpandString:自动解析所有变量,无需逐个替换,但存在安全风险,仅限可信配置使用。
内容的提问来源于stack exchange,提问作者ksoucek
相关产品推荐
相关产品推荐

