我很困惑为什么我尝试从不同位置获取信息时会得到不同的信息。我有 3 台运行 Hyper-V 的 Windows 2012 服务器(G0、G1 和 G2)。以下情况是从一台服务器捕获的,我用它来运行脚本并控制其他服务器。
我想要做的是获取这三台机器上存在的虚拟机列表:
使用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
我主要担心的是,我无法从这 3 个工具中获得可靠的信息。该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\模块\Hyper-V\Hyper-V.psd1
如果我尝试加载所使用的模块PowerShell
,PowerGUI
我仍然会得到相同不同的结果。
Hyper-V
如何使用PowerGUI
或才能获得列出的正确信息PowerShell ISE
?
答案1
我敢打赌你正在使用两个不同的 Hyper-V PowerShell 模块:
NAME
Get-VMHost
SYNOPSIS
Lists Hyper-V servers registered with Active Directory.
这是 Get-VMhost cmdletpshyperv.codeplex.com,它列出了多个 Hyper-V 主机,在你的情况下是 3
NAME
Get-VMHost
SYNOPSIS
Gets a Hyper-V host.
这是 Server 2012+ 上的 Hyper-V 3 附带的 Get-VMhost cmdlet,它仅列出有关一个特定主机的信息,而不会列出多个主机。
如果两个模块都加载了,ISE 似乎对这些模块的选择与 PoweShell 有所不同。
如果您在 2012 年拥有内置 cmdlet,我就不会使用第三方 cmdlet,因为它只会造成混淆,肯定会让您感到困惑。
你的价值是多少$env:psmodulepath
?
答案2
看来 Peter 的做法是对的。你试过吗:
- 使用 Remove-Module cmdlet 从 PS 控制台删除 Microsoft.HyperV.PowerShell.dll 模块
- 导入PowerGUI中引用的模块?
使用此命令来验证该命令是否正在从正确的模块使用。
Get-Module (get-command Get-VMHost).ModuleName | select Name, Path
或者,在验证导入的模块后使用完全限定名称。
Hyper-V\Get-VMHost "hyperv01svr"
答案3
主持人可以设置默认格式不同类型的值,当您调用 select-object cmdlet 并将结果发送到 out-default 时将使用这些值。在这种情况下,cmdlet 还可能根据 $host.name 的值更改输出。
如果您想要相同的输出,可以尝试通过 format-list 或 format-table 传递它,而不是 select。在某些情况下,您可能还需要将其传递给 out-string 以“锁定”输出,因为某些主机不支持格式 cmdlet(尤其是在作为脚本或非交互模式下运行时)。
如果您确实想检查输出,最好使用... | 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 服务器进行测试,但上述内容是我通常用来测试不同主机之间奇怪行为的方法。