使用 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