PowerShell 与 PowerShell ISE 和 PowerGUI 中的虚拟机列表

PowerShell 与 PowerShell ISE 和 PowerGUI 中的虚拟机列表

我很困惑为什么我尝试从不同位置获取信息时会得到不同的信息。我有 3 台运行 Hyper-V 的 Windows 2012 服务器(G0、G1 和 G2)。以下情况是从一台服务器捕获的,我用它来运行脚本并控制其他服务器。

我想要做的是获取这三台机器上存在的虚拟机列表:

使用PowerGUIPowerShell 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

如果我尝试加载所使用的模块PowerShellPowerGUI我仍然会得到相同不同的结果。

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 的做法是对的。你试过吗:

  1. 使用 Remove-Module cmdlet 从 PS 控制台删除 Microsoft.HyperV.PowerShell.dll 模块
  2. 导入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 服务器进行测试,但上述内容是我通常用来测试不同主机之间奇怪行为的方法。

相关内容