You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过PowerCLI实现两个ESXi VM变量按Name字段关联合并?

当然有办法实现啦!在PowerShell(包括PowerCLI)里,我们可以通过几种方式把这两个数据集按Name字段关联起来,生成包含Name、OS、GB的合并表格,下面给你两种实用的方案:

方案一:原生PowerShell循环实现(无需额外模块)

这种方案不需要安装任何额外模块,兼容性拉满,适合所有PowerCLI环境:

# 遍历$all中的每台虚拟机,匹配对应磁盘空间数据
$mergedResult = $all | ForEach-Object {
    $currentVM = $_
    # 从$space中找到Name完全匹配的条目
    $matchingSpace = $space | Where-Object { $_.Name -eq $currentVM.Name }
    # 构建合并后的自定义对象
    [PSCustomObject]@{
        Name = $currentVM.Name
        OS   = $currentVM.OS
        GB   = $matchingSpace.'disk-size'  # 注意属性名带连字符,需要用引号包裹
    }
}

# 输出合并后的结果表格
$mergedResult

原理说明

我们逐个处理$all里的虚拟机对象,通过Name字段去$space集合里定位对应的磁盘空间数据,然后把三个需要的字段打包成新的自定义对象,最终组成完整的合并数据集。如果某台虚拟机在$space里没有对应数据,GB列会显示为$null,你可以根据需求添加默认值(比如改成GB = $matchingSpace.'disk-size' ?? '无数据')。

方案二:使用Join-Object模块(更简洁)

如果你的环境允许安装第三方模块,Join-Object可以像SQL的JOIN操作一样快速合并数据集,代码更简洁:

首先安装模块(仅需执行一次):

Install-Module -Name Join-Object -Scope CurrentUser -Force

然后执行合并操作:

# 关联两个集合,并重命名disk-size为GB
$mergedResult = $all | Join-Object -JoinType Inner -On Name -With $space -Property Name, OS, @{Name='GB'; Expression={$_. 'disk-size'}}

# 查看结果
$mergedResult

关键参数说明

  • -JoinType Inner:只保留两个集合中Name都存在的虚拟机(类似SQL的INNER JOIN);如果想保留$all里的所有虚拟机(即使$space中无对应数据),可以改成-JoinType Left。
  • -On Name:指定用来关联两个集合的字段为Name。
  • -Property:定义最终结果要包含的字段,这里我们把disk-size重命名为更直观的GB。

内容的提问来源于stack exchange,提问作者newbie

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.07 00:27:32