OutVariable 对于 Exchange 2010 cmdlet 不起作用

OutVariable 对于 Exchange 2010 cmdlet 不起作用

使用 Exchange 2010 cmdlet 时,OutVariable 似乎出现故障。只有我的服务器出现这种情况,还是每个人都出现这种情况?我观察到以下情况——

get-mailbox jdoe -OutVariable asdf | out-null
$asdf.getType()

You cannot call a method on a null-valued expression.
At line:1 char:14
+ $asdf.getType <<<< ()
    + CategoryInfo          : InvalidOperation: (getType:String) [], RuntimeException
    + FullyQualifiedErrorId : InvokeMethodOnNull

在上面的例子中,$asdf永远不会被创建并且get-mailbox jdoe绝对会返回一些东西。

get-childitem -OutVariable asdf | out-null
$asdf.getType()
[PS] C:\temp>$asdf.getType()

IsPublic IsSerial Name                                     BaseType
-------- -------- ----                                     --------
True     True     ArrayList                                System.Object

在此示例中,由于不是 Exchange 2010 cmdlet,$asdf因此按预期创建。get-childitem

答案1

老实说,在您之前的帖子之后,我尝试过这种方法(我的示例是我测试过的真实代码 - 在我的测试中有效)。但我在我的 EX 服务器(VM)上运行它们。而且我没有使用 EM Shell,我只是将 EX snapins 添加到我的“常规”powershell.exe 中

有什么区别?好吧,让我们仔细看看 Exchange 命令行管理程序中的命令:

Get-Command Get-Mailbox | select CommandType

EMS 在后台使用 PSRemoting 和隐式远程处理。为什么这很重要?好吧,让我们看看 -OutVariable 如何用于通常会给您结果的隐式远程命令,例如 ls:

$Session = New-PSSession -ComputerName EX
Import-PSSession -Prefix Test -Session $Session -CommandName Get-ChildItem
Get-TestChildItem -OutVariable Foo | Out-Null
$Foo -eq $null

True

您还可以查看这篇文章以了解有关 EMS 魔法的更多详细信息: http://www.mikepfeiffer.net/2010/02/managing-exchange-2010-with-remote-powershell/

目前为止,我不确定这是错误,还是对象序列化/反序列化的副作用,或者只是隐式远程处理的一般工作原理。但这绝对是根本原因,而不是 EX cmdlet 本身(因为如您所见 - 您通常实际上并不使用 cmdlet....)因此 - 正如我所说 - 您最好使用 Add-Member(我链接的帖子中的示例必须更新,之前我曾两次使用 Get-Mailbox 而不是 Get-MailboxStatistics)。它也不是万无一失的(至少我的示例有点脆弱)但至少它可以工作...而且您显然可以运行“常规”powershell,然后执行以下操作:

 Add-PSSnappin -Name Microsoft.Exchange.*

...并忽略远程内容。

答案2

我刚刚遇到了完全相同的问题-ErrorVariable为什么 Exchange 2010 cmdlet 忽略了 ErrorVariable?

无论根本原因是什么(很可能涉及隐式远程处理),解决方案是使用全局范围的变量:

Get-Mailbox UserName -OutVariable global:outvar

相关内容