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

PowerShell中含字符串数组的对象无法正常导出CSV求解决方案

PowerShell修复方案:对比VMware生产与DR虚拟机并导出合规CSV

原代码核心问题

  1. 变量未定义:使用$replicaservers但实际定义的是$replicaserversfull,导致逻辑失效
  2. 数组处理错误:批量对数组调用Trim()方法,而非逐个元素处理,匹配逻辑完全错误
  3. 输出格式错误:用Out-String将数组转为大段文本,导致CSV无法结构化展示
  4. 对象构造不合理:将所有结果塞进单个对象的属性,无法生成符合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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 19:05:23