使用 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
在此示例中,$asdf
按预期创建,因为get-childitem
它不是 Exchange 2010 cmdlet。
老实说,在你之前的帖子之后我已经尝试过了(我的例子是我测试过的真实代码 - 它在我的测试中有效)。但我在我的 EX 服务器 (VM) 上运行它们。而且我没有使用 EM Shell,我只是将 EX 管理单元添加到我的“常规”powershell.exe
有什么不同?那么,仔细看看 Exchange Management Shell 中的命令:
EMS 在后台使用 PSRemoting 和隐式远程处理。为什么重要?好吧,让我们看看 -OutVariable 将如何用于通常会为您提供结果的隐式远程命令,例如 ls:
您还可以查看这篇文章以了解有关 EMS 魔法的更多详细信息:http: //www.mikepfeiffer.net/2010/02/managing-exchange-2010-with-remote-powershell/
ATM 我不确定这是一个错误,还是对象序列化/反序列化的副作用,或者隐式远程处理的一般工作方式。但这绝对是根本原因,而不是 EX cmdlet 本身(因为如您所见 - 您通常并没有真正使用 cmdlet......)所以 - 正如我所说 - 你最好使用 Add-Member (我在你的链接帖子中的例子必须更新,以前我使用 Get-Mailbox 两次而不是 Get-MailboxStatistics)。它也不是防弹的(至少我的例子有点脆弱)但至少它有效......你显然可以只运行“常规”powershell,然后做:
...并忽略远程处理的东西。
我刚刚遇到了完全相同的问题
-ErrorVariable
:Why are Exchange 2010 cmdlets ignoring ErrorVariable? .无论根本原因是什么(很可能涉及隐式远程处理),解决方案是使用全局范围的变量: