Exchange邮箱EmailAddresses添加字符串无效,替换正常问题咨询
问题分析与解决
核心问题原因
你第一个命令的无效,是因为错误使用了-join运算符:
- 在
ForEach-Object中,$_代表单个SMTP地址字符串(比如smtp:juan@contoso.com),而-join是用来拼接数组元素的运算符,单个字符串作为仅含一个元素的数组,执行$_ -join '_OLD'不会产生任何变化,自然看不到添加的_OLD后缀。
修正后的命令
如果要给每个SMTP地址添加_OLD后缀,改用字符串拼接方式(+运算符或字符串插值):
Get-Mailbox -ResultSize Unlimited | Select-Object DisplayName, PrimarySmtpAddress, @{Name="EmailAddresses";Expression={ $_.EmailAddresses | Where-Object {$_ -clike "*smtp*"} | ForEach-Object { $_ + '_OLD' } }} | Where-Object { $_.PrimarySmtpAddress -eq "juan@contoso.com" }
如果需要把所有处理后的地址用指定分隔符连成单个字符串(参考第二个命令的输出形式),将-join移到整个表达式末尾:
Get-Mailbox -ResultSize Unlimited | Select-Object DisplayName, PrimarySmtpAddress, @{Name="EmailAddresses";Expression={ ($_.EmailAddresses | Where-Object {$_ -clike "*smtp*"} | ForEach-Object { $_ + '_OLD' }) -join "OLD" }} | Where-Object { $_.PrimarySmtpAddress -eq "juan@contoso.com" }
为什么第二个命令能正常工作
第二个命令中,ForEach-Object内的-replace是对单个字符串做替换操作,之后用-join "OLD"将整个处理后的地址数组拼接成单个字符串,所以能正确输出结果。
内容的提问来源于stack exchange,提问作者Botellita Taponzito
相关产品推荐
相关产品推荐

