【问题标题】:Unable to run Get-CASMailbox in Powershell using -filter clause with a pipeline variable无法在 Powershell 中使用带有管道变量的 -filter 子句运行 Get-CASMailbox
【发布时间】:2011-10-12 17:36:27
【问题描述】:

我在 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:无法将参数“过滤器”绑定到目标。异常设置“过滤器”:“无法投射'System.Management.Automa'类型的对象 tion.PSObject' 来输入 'System.String'。” 在 C:\Users\erawlins\Desktop\MailboxFilterBug.ps1:7 char:38 + Get-CASMailbox -ResultSize:10 -Filter


我真的对此感到困惑。我已经尝试了我能找到的所有语法,并且在每种情况下尝试使用 $_ 都会引发相同的错误。如果我只是使用任何其他变量,例如 $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 可以正常工作,但前两种方法会引发错误。在我看来,它们中的每一个都应该工作,因为它们都是字符串。有什么区别?

【问题讨论】:

    标签: powershell exchange-server exchange-server-2007


    【解决方案1】:

    试试这个:

    $MailServerList | Foreach-Object { Get-CASMailbox -Filter "ServerName -eq  '$_'" }
    

    【讨论】:

    • Shay,我尝试了你的语法并且确实有效。我之前尝试过以下没有 $MailServerList | %{Get-CASMailbox -Filter {ServerName -eq "$_"}} 看看上面杰森的回答,你的例子是管道变量包含在脚本块中的问题?这是否意味着脚本块中的任何代码都在稍后的某个时间进行评估并且 $_ 超出了范围?通过删除它立即评估它的脚本块?
    • 我相信这是正在发生的事情,这就是我使用字符串过滤器的原因,因此值会在它传递之前立即展开。
    【解决方案2】:

    您正在将一个脚本块传递给过滤器参数,并且您正在引用一个自动变量 ($)。当脚本块被评估时,它可能位于定义 $ 的其他代码中。使用嵌套范围的自动变量时要小心。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-02-23
      • 1970-01-01
      • 1970-01-01
      • 2011-04-30
      • 1970-01-01
      • 2021-08-04
      • 2021-04-16
      相关资源
      最近更新 更多