使用PowerShell提取O365用户代理地址的smtp前缀条目
解决PowerShell提取SMTP前缀代理地址的问题
方法1:拆分字符串后过滤
如果你的代理地址是空格分隔的字符串,先按空格拆分,再筛选以smtp:(支持大小写不敏感)开头的条目:
# 原始代理地址字符串 $proxyAddresses = "smtp:1stline@hatchellwood.onmicrosoft.com smtp:1stline@hatchell.com SMTP:1stline@hatchellwood.com SIP:1stline@hatchellwood.com SPO:SPO_024de2bf-d843-48e0-938d-fb6cfa8dcdbc@SPO_1fef7b7b-eef2-4533-b45e-f7f842c9f6a7" # 拆分并过滤(不区分大小写,匹配SMTP:和smtp:) $filteredSmtp = $proxyAddresses -split '\s+' | Where-Object { $_ -match '^smtp:' } # 如果需要严格匹配小写smtp:,改用大小写敏感的匹配 $filteredSmtpCaseSensitive = $proxyAddresses -split '\s+' | Where-Object { $_ -cmatch '^smtp:' }
-split '\s+':处理多个连续空格的情况,将每个代理地址拆分为单独的数组元素-match '^smtp:':正则匹配以smtp:开头的条目,^表示字符串起始位置,-match默认不区分大小写-cmatch:大小写敏感匹配,仅保留小写smtp:开头的条目
方法2:正则直接提取所有匹配项
用正则表达式一次性提取所有符合条件的代理地址,无需拆分字符串:
$proxyAddresses = "smtp:1stline@hatchellwood.onmicrosoft.com smtp:1stline@hatchell.com SMTP:1stline@hatchellwood.com SIP:1stline@hatchellwood.com SPO:SPO_024de2bf-d843-48e0-938d-fb6cfa8dcdbc@SPO_1fef7b7b-eef2-4533-b45e-f7f842c9f6a7" # 提取所有不区分大小写的smtp:开头的地址 $smtpAddresses = [regex]::Matches($proxyAddresses, '(?i)\bsmtp:[^\s]+') | ForEach-Object { $_.Value }
(?i):开启正则的不区分大小写模式\b:单词边界,确保匹配的是完整的smtp:前缀(避免匹配包含smtp的其他字符串)[^\s]+:匹配从smtp:开始到下一个空格前的所有字符,即完整的代理地址
针对O365 cmdlet的优化
如果你是通过Get-EXOMailbox或Get-MsolUser获取用户代理地址,返回的EmailAddresses本身就是数组格式,直接过滤即可:
# 获取Exchange Online用户的代理地址 $userMailbox = Get-EXOMailbox -Identity "1stline@hatchellwood.com" $userSmtpAddresses = $userMailbox.EmailAddresses | Where-Object { $_ -match '^smtp:' }
这样无需处理字符串拆分,直接对数组元素进行筛选即可。
内容的提问来源于stack exchange,提问作者Alistair Trout
相关产品推荐
相关产品推荐

