我需要获取虚拟机的 vCenter 信息,或者至少只是 vCenter 名称,
我在网上查看了 vmware 帮助,他们所拥有的只是连接到 vCenter 以获取 VM 信息,这与我想要实现的完全相反。甚至可能吗?给我机器 fqdn 和 ipaddress 吗?
谢谢
我需要获取虚拟机的 vCenter 信息,或者至少只是 vCenter 名称,
我在网上查看了 vmware 帮助,他们所拥有的只是连接到 vCenter 以获取 VM 信息,这与我想要实现的完全相反。甚至可能吗?给我机器 fqdn 和 ipaddress 吗?
谢谢
我看到这里的最后一个答案是 5 岁,但就在今天,我找到了一种更深入对象层次结构的方法,而无需处理字符串和拆分。对我来说,这更像是 PoSH 方式。
(Get-VMHost "MyESXHost").GetClient().config.Server
这是另一种在层次结构中不那么深但使用简单拆分的方法。
(Get-VMHost $ESX).GetClient().ServerUri.Split('@')[1]
在某个站点上,我发现了一个示例,该示例使用了之前的答案中较重的拆分。我不太喜欢这种方式,尤其是在可以避免的情况下,我支持这种方法:越简单越好,但它也有效。
Get-VMHost "MyESXHost" | Select-Object Name,@{N="vCenter";E={$_.Uid.Split('@')[1].Split(':')[0]}}
所以,一般来说,有三个属性(也许可以找到更多)给出相同的结果。:
Uid # need splitting
GetClient().ServerUri # need light splitting
GetClient().config.Server # no splitting, only object properties
我不会在这里使用 ForEach 循环,希望这不是问题。
vCenter 名称位于每个对象的 Uid 中。对于 VM,您可以尝试以下代码段:
$vm.Uid.Substring($vm.Uid.IndexOf('@')+1).Split(":")[0]
或者:
Get-VM | % {
[PSCustomObject] @{
Name = $_.Name
vCenter = $_.Uid.Substring($_.Uid.IndexOf('@')+1).Split(":")[0]
}
}
因此,这会遍历连接的 vCenter 中的每个 VM,并获取 VM 名称,然后从 Uid 中提取 vCenter。Uid 的格式似乎是:
/VIServer=[用户名]@[vCenter]:[端口]/VirtualMachine=[VirtualMachineID]
因此它开始在 '@' + 1 的索引处获取 vCenter 名称,然后将生成的字符串拆分为冒号(端口之前的点)并获取该生成数组中的第一项。这可以用正则表达式稍微优雅地完成:
[regex]::Match($vm.Uid,'.*@(.*):').Captures.Groups[1].Value