最初的问题解释了我遇到的问题,而答案似乎可以解决这些问题,但是当我运行这样的脚本时:
Get-View -ViewType VirtualMachine | Select @{N='IP';E={[string]::Join(',',$_.Guest.net.IPAddress)}}
我只得到以下输出:
IP
--
就是这样...我是否遗漏了指定集群或DC等输入,这对其他人有效吗?
Get-View -ViewType VirtualMachine | Select @{N='IP';E={[string]::Join(',',$_.Guest.net.IPAddress)}}
IP
--
就是这样...我是否遗漏了指定集群或DC等输入,这对其他人有效吗?
Get-View
如KERR所指出的那样,在bxm的答案中的代码比我下面的替代方案的代码更快。[对我来说,它一直比KERR声称的快10倍,但仍然更快。]
但请注意,对于Get-View
返回的视图对象,Guest.IPAddress
属性由单个地址组成,甚至可能不是NIC的地址(例如,它可能是VPN连接的地址)。
这里是bxm代码的一行版本(微调过):
Get-View -ViewType VirtualMachine | ?{ $_.Guest.IPAddress -eq "1.2.3.4" }
这里有一个版本,可以检查所有网卡地址:
Get-View -ViewType VirtualMachine | ?{ ($_.Guest.Net | %{ $_.IpAddress }) -contains "1.2.3.4" }
在这里,"1.2.3.4"
是你想要查找相应虚拟机的 IP 地址。
请注意,我的版本与 bxm 的略有不同。bxm 的版本有效地确保任何匹配的虚拟机 只 有指定的 IP 地址被分配 而没有其他的(或者更准确地说,如果 Guest.IPAddress
属性是一个数组的话)。我的版本只确保该虚拟机具有指定的地址,而不管它是否分配了其他任何 IP 地址。
Get-VM
这是我根据 StackUser_py 的答案提供的链接 修改的代码:
Get-VM | Where-Object -FilterScript { $_.Guest.Nics.IPAddress -contains "1.2.3.4" }
VirtualMachine
(对象),而第二种解决方案则返回一个UniversalVirtualMachineImpl
。但是,调用Get-VM
并将其传递给第一个解决方案返回的虚拟机名称不会显著改变持续时间。Get-View
获取到的一个虚拟机的 IP 地址是 VPN 的,甚至不是其中的两个 NIC 中的一个!而 Get-VM
只返回了这两个 NIC 的地址。我无法在该虚拟机的视图对象中找到 VPN IP 地址或任何其他相关网络连接的信息。 - Kenny Evitt$list = Get-View -ViewType VirtualMachine | Select name,@{N='IP';E={[string]::Join(',',$_.Guest.ipaddress)}} $list | ?{ $_.ip -eq "1.2.3.4" }
$_.Guest.ipaddress
是一个(单个)字符串,而不是数组,因此“字符串连接”表达式是不必要的。 - Kenny EvittGet-VM | Where-Object {$_.Guest.IPAddress -eq '1.1.1.2'}
尽管我不确定为什么上述方法仍然无法正常工作,但我找到了以下内容可能会对人们有所帮助。对于大型虚拟机环境非常有用。(这就是我最初从上述脚本中尝试编写的内容)。
注意:我发现这仅适用于PowerCLI 6.3,不适用于PowerCLI 5.8。这可能是为什么 OP 没有得到任何关于“IP”的结果的原因。
最后找到了一种使用 Get-View 并在具有多个 IP 的 VM 上进行搜索(包括 IPv6)的方法:
$ip = "192.168"
$list = get-view -ViewType VirtualMachine
$list | ? {$_.guest.net.IpAddress -match $ip } | select name, @{N='IP';E={[string]::Join(',',$_.Guest.net.IPAddress)}}
还需要注意的是,IpAddress是一个字符串数组,因此,如果你要使用除了-contains之外的任何其他操作(例如-match),那么你需要在ForEach-Object中再添加一层:
Get-View -ViewType VirtualMachine | Where-Object { ($_.Guest.Net | ForEach-Object { $_.IpAddress | ForEach-Object { $_ -match '^1\.2\.3\.4\d$' } }) -contains $true }
这会查找所有IP在1.2.3.40-1.2.3.49范围内的虚拟机