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

Список виртуальных машин из PowerShell против PowerShell ISE и PowerGUI

Я не понимаю, почему у меня разная информация в зависимости от того, откуда я пытаюсь ее получить. У меня есть 3 сервера Windows 2012 (G0, G1 и G2) с Hyper-V. Следующая ситуация получена с одного сервера, который я использую для запуска скриптов и управления другими.

Я пытаюсь получить список виртуальных машин, существующих на этих трех машинах:

С помощью PowerGUI и 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                                                                                        

С помощью 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

Меня больше всего беспокоит то, что у меня нет достоверной информации из трех инструментов. В Hyper-V Manager приложение показывает тот же список, что и PowerShell делает. Но если я запускаю свои сценарии из двух других инструментов, что я в основном и делаю, у меня не будет той же информации, поэтому я не смогу манипулировать одними и теми же виртуальными машинами.

Я также заметил, что Virtual Machine Manager показывает тот же список виртуальных машин, что и первые два инструмента, PowerGUI и PowerShell ISE.

Какая информация действительна? И как мне получить правильный список виртуальных машин?

ИЗМЕНИТЬ 1

В $env:psmodulepath стоимость:

PS > $env:psmodulepath
C:\Users\administrator\Documents\WindowsPowerShell\Modules;
C:\Windows\system32\WindowsPowerShell\v1.0\Modules\;
C:\Program Files (x86)\Microsoft SQL Server\110\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

РЕДАКТИРОВАТЬ 2

PowerShell использует это Hyper-V модуль: C: \ Windows \ Microsoft.Net \ assembly \ GAC_MSIL \ Microsoft.HyperV.PowerShell \ v4.0_6.3.0.0__31bf3856ad364e35 \ Microsoft.HyperV.PowerShell.dll

И PowerGUI использует этот: C: \ Windows \ System32 \ WindowsPowerShell \ v1.0 \ Modules \ Hyper-V \ Hyper-V.psd1

Если я попытаюсь загрузить модуль, используемый PowerShell на PowerGUI Я по-прежнему получаю такие же разные результаты.

Как я могу получить правильную информацию, указанную в Hyper-V с помощью PowerGUI или PowerShell ISE?

Готов поспорить, вы используете два разных модуля Hyper-V PowerShell:

NAME
  Get-VMHost

SYNOPSIS
  Lists Hyper-V servers registered with Active Directory.

это командлет Get-VMhost из pshyperv.codeplex.com, он перечисляет несколько хостов Hyper-V, в вашем случае 3

NAME
  Get-VMHost

SYNOPSIS
 Gets a Hyper-V host.

Это командлет Get-VMhost, который поставляется с Hyper-V 3 на Server 2012+, он просто перечисляет информацию об одном конкретном хосте, он никогда не перечисляет несколько хостов.

Если оба модуля загружены, кажется, что ISE выбирает для этих модулей другие предпочтения по сравнению с PoweShell.

Если у вас есть встроенные командлеты в 2012 году, я бы не стал использовать сторонние командлеты, это просто сбивает с толку, это определенно сбивает вас с толку.

В чем ценность вашего $env:psmodulepath ?

Похоже, Питер на правильном пути. Ты пробовала:

  1. Удаление модуля Microsoft.HyperV.PowerShell.dll из консоли PS с помощью командлета Remove-Module
  2. Импортировать модуль, указанный в PowerGUI?

Используйте эту команду, чтобы убедиться, что команда используется из правильного модуля.

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

В качестве альтернативы используйте полное имя после проверки модуля в импортированном.

Hyper-V\Get-VMHost "hyperv01svr"

Хост имеет возможность установить форматирование по умолчанию для разных типов, которые будут использоваться при вызове командлета select-object и отправке результатов по умолчанию. Также может быть, что в этом случае командлет изменяет вывод на основе значения $ host.name.

Если вам нужен такой же результат, вы можете попробовать передать его через список форматов или таблицу форматов вместо выбора. В некоторых случаях вам может также потребоваться передать его в строку out, чтобы «заблокировать» вывод, поскольку некоторые хосты не поддерживают командлеты формата (особенно при запуске как скрипт или в неинтерактивном режиме).

Если вы действительно хотите проверить вывод, лучше всего сохранить его в переменной, используя ... | Set-Variable testing или $testing = ... а затем используйте $testing | Get-Member чтобы узнать, был ли возвращен тот же объект. В некоторых случаях вам может потребоваться добавить флаг -Force, чтобы включить PSObject методы ATS и ETS которые используются для обертывания базового типа.

Примеры:

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

У меня нет доступа к серверу HyperV для тестирования, но это то, что я обычно использую для проверки странного поведения между разными хостами.