PowerCLI - 通过 VM IP 查找虚拟机

PowerCLI - Finding Virtual Machine via VM IP

我正在尝试根据 PowerCLI 中的 IP 地址定位特定 VM。我在网上找到了这个脚本 Grabbing VM ipaddress via PowerCLI

最初的问题解释了我遇到的问题,答案似乎解决了这些问题,但是当我 运行 这样的脚本时:

Get-View -ViewType VirtualMachine | Select @{N='IP';E={[string]::Join(',',$_.Guest.net.IPAddress)}}

我得到的只是以下输出:

IP
--

就是这样...我是否缺少指定集群或 DC 之类的输入,这对其他人有用吗?

虽然我不确定为什么以上仍然不起作用,但我发现以下内容可能对人们有所帮助。对于大型 VM 环境非常有用。 (这就是我最初尝试从上面编写的脚本)。

Using PowerCLI to Find a Specific Guest IP

我得到的命令对所使用的对象进行了一些小的调整,如下所示:

$list = Get-View -ViewType VirtualMachine | Select name,@{N='IP';E={[string]::Join(',',$_.Guest.ipaddress)}}
$list | ?{ $_.ip -eq "1.2.3.4" }

Get-View

因为 KERR pointed out, the code in 比我下面的替代解决方案中的代码更快。 [对我来说,它始终比 KERR 声称的快 4 倍,而不是快 10 倍;但仍然更快。]

但请注意,对于 Get-View 编辑的视图对象 return,Guest.IPAddress 属性 包含一个地址,它甚至可能不是地址对于 NIC(它可能是,例如 VPN 连接)。

这是 bxm 代码的单行(调整)版本:

Get-View -ViewType VirtualMachine | ?{ $_.Guest.IPAddress -eq "1.2.3.4" }

这是一个应该检查所有 NIC 地址的版本:

Get-View -ViewType VirtualMachine | ?{ ($_.Guest.Net | %{ $_.IpAddress }) -contains "1.2.3.4" }

其中 "1.2.3.4" 是您要为其查找相应 VM 的 IP 地址。

请注意,我的版本与 bxm 的略有不同。 bxm 的版本有效地确保任何匹配的虚拟机 分配了指定的 IP 地址 而没有其他 (或者更确切地说,如果 Guest.IPAddress 属性 是一个数组)。我的版本只确保 VM 具有指定的地址,而不管它分配的任何其他 IP 地址。

Get-VM

这里是我对提供的link处代码的改编:

Get-VM | Where-Object -FilterScript { $_.Guest.Nics.IPAddress -contains "1.2.3.4" }

请注意,这两个解决方案 return 不同的结果,第一个是 VirtualMachine(对象)的(数组),第二个是 UniversalVirtualMachineImpl。但是,调用 Get-VM 并将第一个解决方案 return 编辑的 VM 名称传递给它不会显着改变持续时间。

或者,您也可以这样操作。

Get-VM | Where-Object {$_.Guest.IPAddress -eq '1.1.1.2'}

注意:我发现这仅适用于 PowerCLI 6.3,不适用于 PowerCLI 5.8。这可能就是为什么 OP 没有得到 'IP'.

的任何结果的原因

PowerCLI 5.8(IP 字段为空):

PowerCLI 6.3(已填充 IP 字段):

终于找到了一种在具有多个 IP(包括 IPv6)的 VM 中使用 Get-View 和搜索的方法:

$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 范围内的所有 VM