PowerShell中含字符串数组的对象无法正常导出CSV求解决方案
PowerShell修复方案:对比VMware生产与DR虚拟机并导出合规CSV
原代码核心问题
- 变量未定义:使用
$replicaservers但实际定义的是$replicaserversfull,导致逻辑失效 - 数组处理错误:批量对数组调用
Trim()方法,而非逐个元素处理,匹配逻辑完全错误 - 输出格式错误:用
Out-String将数组转为大段文本,导致CSV无法结构化展示 - 对象构造不合理:将所有结果塞进单个对象的属性,无法生成符合CSV规范的多行条目
修复后的完整代码
Import-Module VMware.VimAutomation.Core # 连接生产VC,获取VM名称字符串数组 Connect-VIServer -Server vcenter-appliance.swacu.net -Force $prodServers = Get-VM | Select-Object -ExpandProperty Name # 连接DR VC,获取VM名称字符串数组 Connect-VIServer -Server drvcenter-appliance.swacu.net -Force $replicaServers = Get-VM | Select-Object -ExpandProperty Name # 筛选DR中无对应生产VM的条目 $notInProd = foreach ($replica in $replicaServers) { $shortName = $replica.TrimEnd('_replica') $shortNameTwo = if ($shortName -like "*_TTN") { $shortName.TrimEnd('_TTN') } else { $shortName } if (-not ($prodServers -contains $shortName) -and -not ($prodServers -contains $shortNameTwo)) { [PSCustomObject]@{ Category = "仅存在于DR" SystemName = $replica } } } # 筛选生产中无对应DR VM的条目 $notInReplica = foreach ($prod in $prodServers) { # 生成DR中可能的对应名称 $possibleReplicaNames = @( "$prod`_replica", if ($prod -notlike "*_TTN") { "$prod`_TTN`_replica" } ) | Where-Object { $_ } if (-not ($replicaServers -contains $possibleReplicaNames)) { [PSCustomObject]@{ Category = "仅存在于生产" SystemName = $prod } } } # 格式1:分类条目式CSV(合规结构化,便于后续处理) $allDiscrepancies = $notInProd + $notInReplica $allDiscrepancies | Export-Csv -Path '.\Results\VM_Discrepancies.csv' -NoTypeInformation -Encoding UTF8 # 格式2:分栏对比式CSV(接近期望的展示样式) $maxEntryCount = [Math]::Max($prodServers.Count, $replicaServers.Count, $notInProd.Count, $notInReplica.Count) $comparisonResults = for ($i = 0; $i -lt $maxEntryCount; $i++) { [PSCustomObject]@{ 生产VM列表 = $prodServers[$i] ?? "" DR副本VM列表 = $replicaServers[$i] ?? "" 生产有/DR无 = $notInReplica[$i].SystemName ?? "" DR有/生产无 = $notInProd[$i].SystemName ?? "" } } $comparisonResults | Export-Csv -Path '.\Results\VM_Comparison.csv' -NoTypeInformation -Encoding UTF8
关键修复说明
- 用
Select-Object -ExpandProperty Name直接提取VM名称为字符串数组,简化对比逻辑 - 修正名称匹配逻辑:逐个处理每个VM名称,生成可能的对应名称进行精准匹配
- 使用
[PSCustomObject]构造结构化对象,替代繁琐的New-Object - 提供两种CSV输出格式:
- 分类条目式:符合CSV规范,适合数据统计或后续脚本处理
- 分栏对比式:接近期望的展示样式,直观呈现两边的差异
- 用
Export-Csv替代Out-File,确保生成标准CSV文件,避免格式混乱
内容的提问来源于stack exchange,提问作者lakerskill
相关产品推荐
相关产品推荐

