如何通过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
相关产品推荐
相关产品推荐

