Powershell如何将两条VMware属性查询结果合并为两列导出CSV
PowerShell合并VMware查询结果导出CSV方案
核心说明
不要使用Format-Table实现该需求,Format-Table输出的是控制台格式化对象,不保留原始属性值,无法正常导出为CSV。推荐直接遍历VM构造自定义对象实现属性合并,完全避免数据错行问题。
最优实现方案(单次遍历无错位)
只查询一次VM列表,每个VM同时获取需要的三类属性,天然对齐无错配,性能最优:
Get-VM | ForEach-Object { # 读取当前VM的自定义属性值 $updateGroup = $_ | Get-Annotation -CustomAttribute "GrupaAktualizacji" | Select-Object -ExpandProperty Value # 构造合并后的属性对象 [PSCustomObject]@{ Name = $_.Name DnsName = $_.ExtensionData.Guest.Hostname GrupaAktualizacji = $updateGroup } } | Export-Csv -Path "./VM属性汇总.csv" -Encoding UTF8 -NoTypeInformation
如果需要自定义列名,直接修改上方PSCustomObject里的键名即可。
备选方案(两次查询按索引合并,仅推荐测试场景使用)
如果必须分开执行两次查询再合并,可以用数组索引对齐实现,但是要保证两次查询期间VM列表没有新增、删除、改名操作,否则会出现数据错位:
# 分别获取两次查询的结果数组 $vmBaseInfo = Get-VM | Select-Object Name, @{N="DnsName"; E={$_.ExtensionData.Guest.Hostname}} $attrValues = Get-VM | Get-Annotation -CustomAttribute "GrupaAktualizacji" | Select-Object -ExpandProperty Value # 按索引合并两个数组的属性 $mergedData = for ($index = 0; $index -lt $vmBaseInfo.Count; $index++) { $vmBaseInfo[$index] | Add-Member -MemberType NoteProperty -Name "GrupaAktualizacji" -Value $attrValues[$index] -PassThru } # 导出CSV文件 $mergedData | Export-Csv -Path "./VM属性汇总.csv" -Encoding UTF8 -NoTypeInformation
内容的提问来源于stack exchange,提问作者sentus1
相关产品推荐
相关产品推荐

