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