OutVariable не работает для командлетов Exchange 2010

Кажется, что OutVariable не работает при использовании командлетов Exchange 2010. Это просто мой сервер или так у всех? Я заметил следующее -

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

2 ответа

Решение

Если честно, после вашего предыдущего поста я попробовал это (мои примеры, где я тестировал настоящий код - и он работал в моих тестах). Но я запускал их на своем сервере EX (VM). И я не использовал EM Shell, я просто добавил оснастки EX к своему "обычному" 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/

ATM Я не уверен, является ли это ошибкой, или просто побочным эффектом сериализации / десериализации объектов, или просто как неявное удаленное взаимодействие работает в целом. Но это определенно основная причина, а не самих командлетов EX (потому что, как вы можете видеть, вы обычно не используете командлеты....) Так что, как я уже сказал, вам лучше использовать Add-Member (мой пример в вашей связанной публикации) пришлось обновить, ранее я дважды использовал Get-Mailbox вместо Get-MailboxStatistics). Это также не пуленепробиваемое (по крайней мере, мои примеры, где немного хрупкие), но по крайней мере это работает... И вы, очевидно, можете просто запустить "обычную" powershell, и просто сделать:

 Add-PSSnappin -Name Microsoft.Exchange.*

... и игнорировать удаленное взаимодействие.

Я только что столкнулся с точно такой же проблемой с -ErrorVariable: Почему командлеты Exchange 2010 игнорируют ErrorVariable?,

Какой бы ни была основная причина (неявное удаленное взаимодействие очень вероятно), решение состоит в том, чтобы использовать глобальные переменные:

Get-Mailbox UserName -OutVariable global:outvar
Другие вопросы по тегам