OutVariable está quebrado para cmdlets do Exchange 2010

2

Parece que OutVariable é quebrado ao usar os cmdlets do Exchange 2010. É apenas o meu servidor ou é este o caso para todos? Eu observei o seguinte -

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

No exemplo acima, $asdf nunca é criado e get-mailbox jdoe absolutamente retorna algo.

get-childitem -OutVariable asdf | out-null
$asdf.getType()
[PS] C:\temp>$asdf.getType()

IsPublic IsSerial Name                                     BaseType
-------- -------- ----                                     --------
True     True     ArrayList                                System.Object

Neste exemplo, $asdf é criado como esperado, pois get-childitem não é um cmdlet do Exchange 2010.

    
por pk. 24.05.2012 / 15:59

2 respostas

2

Para ser honesto depois do seu post anterior eu tentei isso (meus exemplos onde código real eu testei - e funcionou nos meus testes). Mas eu estava rodando no meu servidor EX (VM). E eu não usei o EM Shell, acabei de adicionar EX snapins ao meu "normal" powershell.exe

Qual é a diferença? Bem, dê uma olhada nos comandos do Shell de Gerenciamento do Exchange:

Get-Command Get-Mailbox | select CommandType

O EMS está usando o PSRemoting e o Implícito remotamente. Por que isso importa? Bem, vamos ver como -OutVariable funcionará para o comando remotamente impacitado que normalmente forneceria resultados, como 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

Você também pode dar uma olhada neste artigo para mais detalhes sobre a mágica do EMS: link

ATM Eu não tenho certeza se isso é um bug, ou apenas efeito colateral de serialização / desserialização de objetos, ou apenas como remoting implícito funciona em geral. Mas isso é definitivamente a causa raiz, não os próprios cmdlets EX (porque, como você pode ver - você não está realmente usando cmdlets normalmente ...) Então - como eu disse - você é melhor com o Add-Member (meu exemplo em sua postagem vinculada teve que ser atualizado, anteriormente eu usei Get-Mailbox duas vezes em vez de Get-MailboxStatistics). Também não é à prova de balas (pelo menos os meus exemplos são um pouco frágeis), mas pelo menos funciona ... E você pode, obviamente, executar o powershell "normal" e fazer:

 Add-PSSnappin -Name Microsoft.Exchange.*

... e ignore coisas remotas.

    
por 25.05.2012 / 09:03
0

Acabei de encontrar exatamente o mesmo problema com -ErrorVariable : Por que o Exchange 2010 cmdlets ignorando ErrorVariable? .

Qualquer que seja a causa raiz (a participação remota implícita provavelmente está envolvida), a solução é usar variáveis com escopo global:

Get-Mailbox UserName -OutVariable global:outvar
    
por 31.07.2013 / 19:01