我在使用Exchange cmdlet Get-CASMailbox的语法时遇到了一些问题。
我在2007环境中运行,并且我在PowerGUI 2.4,3.0和PS ISE 2.0中进行了测试。
用于演示目的的示例代码:
[String[]] $MailServerList = @('IP-0A207B07')
$MailServerList | %{
Get-CASMailbox -ResultSize:10 -Filter {ServerName -eq $_}
}
在此示例中,只有一个邮件服务器。在调用Get-CASMailbox期间,管道运算符$ _是IP-0A207B07和$ _。GetType()确认它是一个字符串。如果此行运行,我会收到以下错误:
Get-CASMailbox:无法将参数'Filter'绑定到目标。异常设置“过滤器”:“无法转换类型为'System.Management.Automa'的对象 .PSObject'输入'System.String'。“ 在C:\ Users \ erawlins \ Desktop \ MailboxFilterBug.ps1:7 char:38 + Get-CASMailbox -ResultSize:10 -Filter<<<< {ServerName -eq $ _} + CategoryInfo:WriteError:(:) [Get-CASMailbox],ParameterBindingException + FullyQualifiedErrorId:ParameterBindingFailed,Microsoft.Exchange.Management.RecipientTasks.GetCASMailbox
我真的很困惑。我已经尝试了我能找到的每种语法,并且在每种情况下尝试使用$ _都会抛出相同的错误。如果我只是任何其他变量,例如$ test = $ _,并在查询中替换它可以正常工作。
认为使用管道运算符可能存在一些问题(可能一旦Get-CASMailbox开始运行其他东西在$ _中)我也尝试使用对象属性(这是原始代码的一部分)。在get-casmailbox调用之前添加了以下两行
$ServerInfo = "" | Select-Object Name
$ServerInfo.Name = $_.ToString()
Get-CASMailbox -ResultSize:10 -Filter {ServerName -eq $ ServerInfo.Name}
失败,同样的错误消息。所以我真的很困惑为什么拿$ _或$ ServerInfo.Name并将其分配给$ test,然后使用$ test工作正常但前两个方法抛出错误。在我看来,这些都应该起作用,因为它们都是弦乐。有什么区别?
答案 0 :(得分:3)
试试这个:
$MailServerList | Foreach-Object { Get-CASMailbox -Filter "ServerName -eq '$_'" }
答案 1 :(得分:1)
您正在将一个scriptblock传递给filter参数,并且您正在引用一个自动变量($ )。在对scriptblock进行评估时,它可能位于定义$ 的其他一些代码中。使用嵌套范围的自动变量时务必小心。