Lista de máquinas virtuais do PowerShell vs PowerShell ISE e PowerGUI

2

Estou confuso com o fato de eu ter informações diferentes com base em onde tento recuperá-las. Eu tenho 3 servidores Windows 2012 (G0, G1 e G2) executando o Hyper-V. A situação a seguir é capturada de um servidor que uso para executar scripts e controlar os outros.

O que estou tentando fazer é obter uma lista das máquinas virtuais existentes nessas três máquinas:

Usando PowerGUI e PowerShell ISE :

PS > Get-VMHost | select name

Name                                                                                               
----                                                                                               
G0.nothing.com                                                                       
G2.nothing.com                                                                           
G1.nothing.com                                                                           


PS > Get-VMHost | Get-VM | select name

Name                                                                                               
----                                                                                               
VM1628856-4                                                                                        
VM1628856-2                                                                                        
VM1628856-6                                                                                        
VM1628856-3                                                                                        
VM1628856-1                                                                                        
VM1628856-5                                                                                        

Usando PowerShell :

PS > Get-VMHost | select name

Name
----
G0


PS > Get-VM

Name         State       CPUUsage(%) MemoryAssigned(M) Uptime   Status
----         -----       ----------- ----------------- ------   ------
VM1107610-1  OffCritical 0           0                 00:00:00 Cannot connect to virtual machine configuration storage
VM1390728-1  OffCritical 0           0                 00:00:00 Cannot connect to virtual machine configuration storage
VM1393540-1  OffCritical 0           0                 00:00:00 Cannot connect to virtual machine configuration storage
VM1393540-10 OffCritical 0           0                 00:00:00 Cannot connect to virtual machine configuration storage
VM1393540-2  OffCritical 0           0                 00:00:00 Cannot connect to virtual machine configuration storage
VM1393540-3  OffCritical 0           0                 00:00:00 Cannot connect to virtual machine configuration storage
VM1393540-4  OffCritical 0           0                 00:00:00 Cannot connect to virtual machine configuration storage
VM1393540-5  OffCritical 0           0                 00:00:00 Cannot connect to virtual machine configuration storage
VM1393540-6  OffCritical 0           0                 00:00:00 Cannot connect to virtual machine configuration storage
VM1393540-7  OffCritical 0           0                 00:00:00 Cannot connect to virtual machine configuration storage
VM1393540-8  OffCritical 0           0                 00:00:00 Cannot connect to virtual machine configuration storage
VM1393540-9  OffCritical 0           0                 00:00:00 Cannot connect to virtual machine configuration storage
VM1833022-1  OffCritical 0           0                 00:00:00 Cannot connect to virtual machine configuration storage

Minha principal preocupação é que não tenho informações confiáveis das três ferramentas. O aplicativo Hyper-V Manager mostra a mesma lista que o PowerShell faz. Mas se eu executar meus scripts das outras duas ferramentas, que é o que eu mais faço, não tenho as mesmas informações disponíveis, portanto não posso manipular as mesmas VMs.

Também notei que Virtual Machine Manager mostra a mesma lista de VMs que as duas primeiras ferramentas, PowerGUI e PowerShell ISE.

Quais informações são válidas? E como posso recuperar a lista correta de VMs?

EDIT 1

O valor $env:psmodulepath :

PS > $env:psmodulepath
C:\Users\administrator\Documents\WindowsPowerShell\Modules;
C:\Windows\system32\WindowsPowerShell\v1.0\Modules\;
C:\Program Files (x86)\Microsoft SQL Server0\Tools\PowerShell\Modules\;
C:\Program Files\Microsoft System Center 2012\Virtual Machine Manager\bin\Configuration Providers\;
C:\Program Files\Microsoft System Center 2012\Virtual Machine Manager\bin\psModules\;
C:\Program Files (x86)\QLogic Corporation\QInstaller\Modules

EDIT 2

PowerShell está usando este módulo Hyper-V : C: \ Windows \ Microsoft.Net \ assembly \ GAC_MSIL \ Microsoft.HyperV.PowerShell \ v4.0_6.3.0.0__31bf3856ad364e35 \ Microsoft.HyperV.PowerShell.dll

E PowerGUI está usando este: C: \ Windows \ System32 \ WindowsPowerShell \ v1.0 \ Módulos \ Hyper-V \ Hyper-V.psd1

Se eu tentar carregar o módulo usado por PowerShell em PowerGUI , ainda obtenho os mesmos resultados diferentes.

Como posso receber as informações corretas listadas em Hyper-V usando PowerGUI ou PowerShell ISE ?

    
por slybloty 29.01.2014 / 01:07

3 respostas

5

Eu aposto que você está usando dois módulos diferentes do Hyper-V PowerShell:

NAME
  Get-VMHost

SYNOPSIS
  Lists Hyper-V servers registered with Active Directory.

este é o cmdlet Get-VMhost de pshyperv.codeplex.com , ele lista vários hosts do Hyper-V, no seu caso 3

NAME
  Get-VMHost

SYNOPSIS
 Gets a Hyper-V host.

Este é o cmdlet Get-VMhost que vem com o Hyper-V 3 no Server 2012+, ele simplesmente lista informações sobre um host específico, nunca lista vários hosts.

Se ambos os módulos forem carregados, parece que o ISE escolhe uma preferência diferente sobre o PoweShell com esses módulos.

Se você tiver os cmdlets internos em 2012, não usaria os cmdlets de terceiros, seria confuso, certamente confundiria você.

Qual é o valor do seu $env:psmodulepath ?

    
por 29.01.2014 / 22:26
1

Parece que Peter está no caminho certo. Você já tentou:

  1. Removendo o módulo Microsoft.HyperV.PowerShell.dll do console PS com o cmdlet Remove-Module
  2. Importar o módulo referenciado no PowerGUI?

Use este comando para verificar se o comando está sendo usado no módulo correto.

Get-Module (get-command Get-VMHost).ModuleName | select Name, Path

Como alternativa, use o nome completo após verificar o módulo no importado.

Hyper-V\Get-VMHost "hyperv01svr"
    
por 03.06.2014 / 18:07
-1

O organizador pode definir uma formatação padrão para diferentes tipos, que serão usados quando você chamar o cmdlet de objeto selecionado e enviar os resultados para out-default. Também pode ser que, nesse caso, o cmdlet esteja alterando a saída com base no valor de $ host.name.

Se você quiser a mesma saída, tente passá-la pela format-list ou format-table em vez de selecionar. Em alguns casos, você também pode precisar passá-lo para fora da sequência para "bloquear" a saída, pois alguns hosts não suportam os cmdlets de formato (especialmente quando executados como um script ou no modo não interativo).

Se você realmente deseja inspecionar a saída, seria melhor salvá-lo em uma variável usando ... | Set-Variable testing ou $testing = ... e, em seguida, usar $testing | Get-Member para ver se o mesmo objeto foi retornado. Em alguns casos, talvez seja necessário adicionar a sinalização -Force para incluir o PSObject ATS e métodos ETS que são usados para quebrar o tipo base.

Exemplos:

Get-VMHost | ft Name | Out-String
Get-VM | Set-Variable VMs
$VMs | Select -First 1 | Get-Member
$VMs | Select -First 1 | GM -Force

Eu não tenho acesso a um servidor HyperV para testes, mas acima eu costumo usar para testar comportamentos estranhos entre hosts diferentes.

    
por 29.01.2014 / 02:56