PowerShell导入CSV发通讯组所有者邮件遇参数转换报错求助
报错根因
报错触发点在脚本第一行的Get-DistributionGroup (ipcsv c:\Scripts\TestEmailList.csv).DisplayName调用:
Import-Csv(别名ipcsv)读取文件后返回的DisplayName列是ArrayList类型的集合,Get-DistributionGroup的Identity参数单次调用仅支持接收单个通讯组标识,不支持直接传入未遍历的集合对象,因此触发类型转换错误。- 原脚本除了传参错误,还存在3个逻辑问题:
- 重复导入CSV、重复调用
Get-DistributionGroup,冗余调用多容易触发Exchange Online限流 - 组显示名的计算逻辑错误:拿组对象的
Name属性调用Get-Mailbox查询无法得到有效结果,会返回空值 - 没有逐组遍历发件,而是把所有组的所有者、所有组地址拼成单封邮件发送,会导致所有收件人收到全量组的通知,信息完全错乱
- 重复导入CSV、重复调用
修复方案
直接逐行遍历CSV中的通讯组条目,单个查询组信息,逐组生成并发送对应通知邮件即可,修复后脚本如下:
# 配置基础参数 $PSEmailServer = "smtp.consoco.com" $csvPath = "c:\Scripts\TestEmailList.csv" $groups = Import-Csv -Path $csvPath foreach ($groupItem in $groups) { # 逐个查询通讯组信息,避免集合传参错误 $dgInfo = Get-DistributionGroup -Identity $groupItem.DisplayName | Select-Object ` PrimarySmtpAddress, @{ Name = "Owner" Expression = { $_.ManagedBy | ForEach-Object { (Get-Mailbox $_).PrimarySMTPAddress } } }, DisplayName # 跳过查询失败、没有配置所有者的组 if (-not $dgInfo -or -not $dgInfo.Owner) { Write-Warning "组 $($groupItem.DisplayName) 查询失败或未配置所有者,跳过发件" continue } # 针对当前组生成专属邮件正文 $body = @" <html><body>Hello $($dgInfo.Owner -join ', '), <br> The Email Admins are in the process of auditing distribution groups, and you have been identified as the owner of the group <b>$($dgInfo.DisplayName) ($($dgInfo.PrimarySmtpAddress))</b>. This group was flagged as being inactive. <p> This Distribution list will be restricted for 60 days then deleted. </body></html> "@ $mailParams = @{ From = 'emailadmins@consoco.com' To = $dgInfo.Owner Subject = 'Attention Distribution List Owner' Body = $body BodyAsHtml = $true Bcc = 'me@consoco.com' Priority = 'High' SmtpServer = $PSEmailServer } # 发送当前组的通知邮件 Send-MailMessage @mailParams Write-Host "已向组 $($dgInfo.PrimarySmtpAddress) 的所有者 $($dgInfo.Owner -join ', ') 发送通知邮件" }
关键调整点
- 移除直接给
Get-DistributionGroup传整个数组的写法,用foreach遍历CSV每一行,单次查询单个组,从根源解决参数类型报错 - 合并重复的CSV导入、组查询逻辑,一次查询就拿到组地址、所有者、组显示名所有需要的字段,减少无效调用
- 修正组显示名取值逻辑,直接读取组对象自带的
DisplayName属性,删除无效的Get-Mailbox调用 - 逐组生成邮件正文、逐组发送,保证每个所有者仅收到自己负责的组的通知;同时兼容一个组有多个所有者的场景,自动拼接多所有者邮箱为合法收件人格式
- 增加容错逻辑:遇到CSV中名称错误查不到的组、未配置所有者的组,输出警告后跳过,不会导致整个脚本运行中断
内容的提问来源于stack exchange,提问作者Nupe2012
相关产品推荐
相关产品推荐

