如何解决是否可以仅从公用文件夹中提取 SMTP 地址
我正在尝试使用 get-mailpublicfolder 命令提取与我们的某些 Exchange 2010 公共文件夹关联的 SMTP 地址列表
虽然我可以提取 WindowsEmailAddress 和 EmailAddresses 值,但后者包含我想排除的 X400 地址。
https://unlockpowershell.wordpress.com/2010/01/27/powershell-get-mailbox-display-smtp-addresses/
但这似乎只适用于 Get-MailBox,因为以下代码返回以下错误
$data=Get-MailPublicFolder -Identity $id |select-object WindowsEmailAddress,@{Name="EmailAddresses";Expression={$_.EmailAddresses}|Where-Object {$_.PrefixString -ceq "smtp:"}}| ForEach-Object {$_.SmtpAddress}
Select-Object : Key "Expression" has illegal type System.Management.Automation.PSObject; expected types are {System.Str
ing,System.Management.Automation.ScriptBlock}.
At C:\Temp\FindAllEmailAdresses_v1.ps1:33 char:56
+ $data=Get-MailPublicFolder -Identity $id |select-object <<<< WindowsEmailAddress,@{Name="EmailAddresses";Expression=
{$_.EmailAddresses}|Where-Object {$_.PrefixString -ceq "smtp:"}}| ForEach-Object {$_.SmtpAddress}
+ CategoryInfo : InvalidArgument: (:) [Select-Object],NotSupportedException
+ FullyQualifiedErrorId : DictionaryKeyIllegalValue1,Microsoft.PowerShell.Commands.SelectObjectCommand
Select-Object : Key "Expression" has illegal type System.Management.Automation.PSObject; expected types are {System.Str
ing,System.Management.Automation.ScriptBlock}.
或
$data=Get-MailPublicFolder -Identity $id |select WindowsEmailAddress,@{Name="EmailAddresses";Expression={$_.EmailAddresses}|Where-Object {$_.PrefixString -ceq "smtp:"}}
+ $data=Get-MailPublicFolder -Identity $id |select <<<< WindowsEmailAddress,@{Name="EmailAddresses";Expression={$_.
ilAddresses}|Where-Object {$_.PrefixString -eq "smtp:"}}
+ CategoryInfo : InvalidArgument: (:) [Select-Object],Microsoft.PowerShell.Commands.SelectObjectCommand
Select-Object : Key "Expression" has illegal type System.Management.Automation.PSObject; expected types are {System.
ing,System.Management.Automation.ScriptBlock}.
At C:\Temp\FindAllEmailAdresses_v1.ps1:31 char:49
是否可以只提取 SMTP 地址,或者我是否也坚持提取 x400 地址? 提前致谢
编辑
根据答案,我已将代码更改为以下代码,并进行了一项更改,即从 -ceq "smtp:" 部分中删除冒号,因为将其保留在原位会生成电子邮件地址不被退回。请注意,这是我的错误,而不是 Dougs,因为他们只是根据我之前提供的代码编写了代码。
$expression = {$_.EmailAddresses | Where-Object {$_.PrefixString -ceq "smtp"} | ForEach-Object {$_.SmtpAddress}}
$selectprops = 'WindowsEmailAddress',@{Name="EmailAddresses"; Expression=$expression}
$data = Get-MailPublicFolder -Identity $id | Select-Object $selectprops
解决方法
这是格式化/缩进可以为您节省大量时间和挫折的地方。您收到的错误是您的表达式(计算属性的 e={}
部分)只能是字符串或脚本块。简而言之,这两个命令在错误的位置都有一个花括号。避免这种情况的一种真正简单的方法是将代码块存储在变量中。
这是移动了大括号的原始行。
$data = Get-MailPublicFolder -Identity $id |select-object WindowsEmailAddress,@{Name="EmailAddresses"; Expression={$_.EmailAddresses | Where-Object {$_.PrefixString -ceq "smtp:"}| ForEach-Object {$_.SmtpAddress}}}
和
$data = Get-MailPublicFolder -Identity $id |select WindowsEmailAddress,@{Name="EmailAddresses";Expression={$_.EmailAddresses|Where-Object {$_.PrefixString -ceq "smtp:"}}}
这是我真正推荐的
$expression = {$_.EmailAddresses | Where-Object {$_.PrefixString -ceq "smtp:"} | ForEach-Object {$_.SmtpAddress}}
$selectprops = 'WindowsEmailAddress',@{Name="EmailAddresses"; Expression=$expression}
$data = Get-MailPublicFolder -Identity $id | Select-Object $selectprops
或
$expression = {$_.EmailAddresses | Where-Object {$_.PrefixString -ceq "smtp:"}}
$selectprops = 'WindowsEmailAddress',@{Name="EmailAddresses";Expression=$expression}
$data = Get-MailPublicFolder -Identity $id | Select-Object $selectprops
注意
我保留了 powershell 2.0 代码格式,以防您使用旧版本。如果是 5.1,则可以稍微整理一下。
$expression = {$_.EmailAddresses | Where-Object PrefixString -ceq "smtp:" | ForEach-Object SmtpAddress}
$selectprops = 'WindowsEmailAddress',@{Name="EmailAddresses"; Expression=$expression}
$data = Get-MailPublicFolder -Identity $id | Select-Object $selectprops
或
$expression = {$_.EmailAddresses | Where-Object PrefixString -ceq "smtp:"}
$selectprops = 'WindowsEmailAddress',@{Name="EmailAddresses";Expression=$expression}
$data = Get-MailPublicFolder -Identity $id | Select-Object $selectprops
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。