PowerShell脚本问题:如何仅发送符合阈值的证书到期信息至邮件正文
解决邮件仅发送筛选后证书到期信息的问题
嗨,我来帮你搞定这个问题!你的脚本现在会把CSV里所有内容都塞进邮件,核心原因是你没有保存筛选后的结果,反而用了原始的$cert变量生成邮件正文。另外还有个小语法问题需要修正,咱们一步步来:
问题出在哪?
你写的筛选语句$cert | Select-Object ... | Where-Object {...}只是执行了筛选操作,但没有把结果存到变量里,之后发邮件时用($cert | Out-String),自然会把所有原始CSV内容放进去。另外,访问对象属性时,$_"Certificate Expiration Date"少了个点号,正确写法应该是$_."Certificate Expiration Date"。
修正后的完整脚本
# 获取当前日期 $now = Get-Date # 导入CSV文件 $cert = Import-Csv C:\Users\userID\Desktop\Certificate_CSV2.csv # 设置到期阈值(70天) $threshold = 70 # 计算到期截止日期(当前日期往后推70天) $deadline = (Get-Date).AddDays($threshold) # 筛选出70天内到期的证书,并存入变量保存结果 $expiringCerts = $cert | Select-Object "Service Name", "Certificate Expiration Date" | Where-Object { $_."Certificate Expiration Date" -as [datetime] -le $deadline } # 发送邮件,使用筛选后的结果生成正文 Send-MailMessage -To "SentTo@email.com" ` -Subject "test message 8" ` -From "SentFrom@email.com" ` # 建议发件人地址和收件人区分开,避免被邮件系统拦截 -Body ($expiringCerts | Out-String) ` -SmtpServer pobox.email.com
关键改动说明
- 保存筛选结果:把筛选后的证书信息存到
$expiringCerts变量里,确保后续所有操作都只针对符合条件的内容 - 修正属性访问语法:
$_."Certificate Expiration Date"加上点号,这是PowerShell访问对象属性的标准写法 - 用筛选变量生成正文:邮件正文改用
$expiringCerts | Out-String,这样就只会发送你需要的、70天内到期的服务名称和证书日期信息
如果筛选后没有符合条件的证书,邮件正文会是空的,你后续也可以加个判断逻辑,比如如果$expiringCerts为空就不发邮件,或者发送“暂无即将到期证书”的提示,不过先搞定核心需求再说~
内容的提问来源于stack exchange,提问作者Jim Silver
相关产品推荐
相关产品推荐

