我创建了一个自动构建脚本来在 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 正在输出什么,因为我不确定它是否会直接通过管道传输到 get-wmiobject。您可能需要将其通过管道传输到 foreach-object 并以这种方式检索计算机名。
****编辑****
希望这可以帮助。
谢谢,蒂姆。