Powershell

如何使用 PowerShell 在 Hyper-V 上獲取 Windows 2008 R2 VM 的 IP 地址?

  • January 13, 2017

我創建了一個自動建構腳本來在 Hyper-V 2016 上建構新的虛擬機。我有時需要一個 2008 R2 虛擬機,我獲取 IP 地址以連接到我的 2012 R2/2016 虛擬機的方法是使用一些 powershell,例如:

get-vm -Name $VMName|Get-VMNetworkAdapter|Select-Object -ExpandProperty IpAddresses

適用於 2012/2016,但返回一個帶有 2008 R2 VM 的空數組。關於如何使用 Powershell 從 Hyper-V 獲取 IP 地址的任何想法?該腳本從 Windows 10 工作站執行。

編輯

我嘗試get-vm -name $VMName|Get-WmiObject -Class Win32_NetworkAdapterConfiguration作為測試並在大量適配器輸出後得到了這個:

Get-WmiObject :輸入對像不能綁定到命令的任何參數,因為命令不接受管道輸入,或者輸入及其屬性與接受管道輸入的任何參數都不匹配。

解決方案

這就是我最終做的事情:

$VMName = <the name of my vm>
Invoke-Command -Session $VMHostSession -ScriptBlock {
   $Vm = Get-WmiObject -Namespace root\virtualization\v2 -Query "Select * From Msvm_ComputerSystem Where ElementName='$using:VMName'";
   $vm.GetRelated("Msvm_KvpExchangeComponent").GuestIntrinsicExchangeItems | % { ` 
       $GuestExchangeItemXml = ([XML]$_).SelectSingleNode("/INSTANCE/PROPERTY[@NAME='Name']/VALUE[child::text()='NetworkAddressIPv4']"); 

       if ($GuestExchangeItemXml -ne $null) 
       { 
           $GuestExchangeItemXml.SelectSingleNode("/INSTANCE/PROPERTY[@NAME='Data']/VALUE/child::text()").Value; 
       }    
   }
}

您可以為此使用 WMI。也許 2008R2 沒有你要找的領域。

get-vm -Name $VMName | Get-WmiObject -Class Win32_NetworkAdapterConfiguration -computername $_ | select-object IPAddress

如果您有多個網卡,您可能還需要對您選擇的網卡進行一些過濾。您可能還需要檢查 get-vm 正在輸出什麼,因為我不確定它是否會直接通過管道傳輸到 get-wmiobject。您可能需要將其通過管道傳輸到 foreach-object 並以這種方式檢索電腦名。

編輯

get-vm -Name $VMName | foreach-object { Get-WmiObject -Class Win32_NetworkAdapterConfiguration -computername $_.name } | select-object IPAddress

希望這可以幫助。

謝謝,蒂姆。

引用自:https://serverfault.com/questions/823511