2

我需要获取虚拟机的 vCenter 信息,或者至少只是 vCenter 名称,

我在网上查看了 vmware 帮助,他们所拥有的只是连接到 vCenter 以获取 VM 信息,这与我想要实现的完全相反。甚至可能吗?给我机器 fqdn 和 ipaddress 吗?

谢谢

4

2 回答 2

1

我看到这里的最后一个答案是 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 循环,希望这不是问题。

于 2022-02-11T19:28:44.567 回答
1

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
于 2017-03-16T20:31:54.823 回答