Назад | Перейти на главную страницу

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.

Честно говоря, после вашего предыдущего поста я пробовал это (мои примеры, где я тестировал реальный код - и он работал в моих тестах). Но я запускал их на своем сервере EX (ВМ). И я не использовал EM Shell, я просто добавил оснастку EX в свой "обычный" powershell.exe

Какая разница? Что ж, присмотритесь к командам в Exchange Management Shell:

Get-Command Get-Mailbox | select CommandType

EMS использует PSRemoting и неявное удаленное взаимодействие под капотом. Почему это важно? Что ж, давайте посмотрим, как -OutVariable будет работать для команды impicitly-remote, которая обычно дает вам результаты, например 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