我已经创建了一个自动构建脚本,以在 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;
}
}
}
答案1
您可以使用 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
希望这可以帮助。
谢谢,蒂姆。