AD单用户密码过期邮件通知配置:PowerShell报字符串终止符错误
脚本解析报错修复方案
报错直接成因
PowerShell在解析到-body参数对应的字符串行时,因为多行命令的续行规则不严谨、加上可能混入的全角引号字符,判定双引号没有正确闭合,直接触发字符串终止符缺失的解析错误,不会进入实际执行阶段。
分步修复操作
- 重构
Send-MailMessage的多行参数写法,避免续行符不匹配的问题:
原代码的错误写法存在两个典型问题:一是最后一行body参数作为多行命令的组成部分,没有和上一行的续行规则形成闭环;二是嵌套了变量的长字符串直接放在参数位置,容易因为引号转义问题触发解析错误。
替换为更稳妥的写法:foreach ($user in $users) { # 先单独定义邮件内容、主题变量,规避字符串解析问题 $mailSubject = "Your password will expire in $($user.DaysToExpiry) days" $mailBody = "Your password will expire at $($user.ExpiryDate) (India Standard Time)" Send-MailMessage ` -From "it@specopsdemo1.com" ` -SmtpServer smtp-server.domain.com ` -To $user.Mail ` -Subject $mailSubject ` -Body $mailBody } - 修复脚本内其他隐藏的语法硬伤,避免修改完字符串问题后继续报其他错误:
- 原
Get-ADUser命令行的–Server参数前是全角长破折号,需替换为半角短横-,否则PowerShell无法识别参数标识 - 原
ExpiryDate计算逻辑没有做时区转换:目前转换得到的是UTC时间,和邮件正文标注的"India Standard Time"不匹配,需补充时区转换逻辑:@{Name="ExpiryDate";Expression={ $utcExpiry = [datetime]::FromFileTime($_."msDS-UserPasswordExpiryTimeComputed") # 转换为印度标准时间 [TimeZoneInfo]::ConvertTimeBySystemTimeZoneId($utcExpiry, "India Standard Time") }} - 原
DaysToExpiry的计算逻辑直接用FileTime数值除以常量,容易因为时间精度偏差导致天数统计错误,替换为基于时间对象的差值计算:@{Name="DaysToExpiry";Expression={ $utcExpiry = [datetime]::FromFileTime($_."msDS-UserPasswordExpiryTimeComputed") [int]($utcExpiry - (Get-Date).ToUniversalTime()).TotalDays }}
- 原
- 修改完成后,先执行语法校验:在PowerShell中运行脚本的语法检查指令
[System.Management.Automation.PSParser]::Tokenize((Get-Content .\notification.ps1 -Raw), [ref]$null),确认没有解析类报错后再正式执行脚本。
内容的提问来源于stack exchange,提问作者user4948798
相关产品推荐
相关产品推荐

