PowerShell vs PowerShell ISE和PowerGUI的虚拟机列表

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

我想要做的是获得这3台机器上的虚拟机列表:

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

我主要关心的是,我没有从这三种工具获得可靠的信息。 Hyper-V Manager应用程序显示与PowerShell相同的列表。 但是如果我从其他两个工具运行我的脚本,这是我主要做的,我没有相同的信息可用,因此我不能操纵相同的虚拟机。

我还注意到, Virtual Machine Manager显示了与前两个工具PowerGUI和PowerShell ISE相同的VM列表。

哪些信息有效? 我怎样才能检索正确的虚拟机列表?

编辑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 \程序集\ 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我仍然会得到相同的结果。

如何使用PowerGUIPowerShell ISE接收Hyper-V下列出的正确信息?

我敢打赌你正在使用两个不同的Hyper-V PowerShell模块:

 NAME Get-VMHost SYNOPSIS Lists Hyper-V servers registered with Active Directory. 

这是来自pshyperv.codeplex.com的Get-VMhost cmdlet,它列出了多个Hyper-V主机,在您的情况3

 NAME Get-VMHost SYNOPSIS Gets a Hyper-V host. 

这是Server 2012+上的Hyper-V 3附带的Get-VMhost cmdlet,它仅列出有关特定主机的信息,从不列出多个主机。

如果两个模块都加载了,看起来ISE在这些模块上selectPoweShell。

如果你在2012年有内置的cmdlet,我不会使用第三方的cmdlet,这只是令人困惑,它肯定会让你困惑。

你的$env:psmodulepath的价值是什么?

看起来彼得在正确的轨道上。 你有没有尝试过:

  1. 使用Remove-Module cmdlet从PS控制台中删除Microsoft.HyperV.PowerShell.dll模块
  2. 导入PowerGUI中引用的模块?

使用此命令来validation命令正在使用正确的模块。

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

validation导入的模块后,也可以使用完全限定的名称。

 Hyper-V\Get-VMHost "hyperv01svr" 

主机可以为不同types设置默认格式 ,当您调用select-object cmdlet并将结果发送到默认值时,将使用该格式 。 也可能是在这种情况下,cmdlet正在根据$ host.name的值更改输出。

如果你想要相同的输出,你可以尝试通过格式列表或格式表而不是select。 在某些情况下,您可能还需要将其传递给out-string以“locking”输出,因为某些主机不支持格式cmdlet(特别是以脚本或非交互模式运行时)。

如果你真的想检查输出,最好使用... | Set-Variable testing将它保存到一个variables中 ... | Set-Variable testing$testing = ...然后使用$testing | Get-Member $testing | Get-Member查看是否返回了相同的对象。 在某些情况下,您可能需要添加-Force标志以包含用于包装基本types的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服务器进行testing,但是以上是我通常用来testing不同主机之间的奇怪行为。