Я не понимаю, почему у меня разная информация в зависимости от того, откуда я пытаюсь ее получить. У меня есть 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.
Какая информация действительна? И как мне получить правильный список виртуальных машин?
В $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
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
?
Похоже, Питер на правильном пути. Ты пробовала:
Используйте эту команду, чтобы убедиться, что команда используется из правильного модуля.
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 для тестирования, но это то, что я обычно использую для проверки странного поведения между разными хостами.