PowerShell导出CSV时相同字段值仅首行显示的代码修改方法
PowerShell导出CSV同虚拟机重复字段留空实现方案
核心逻辑是通过标记位识别单台虚拟机下第一块符合筛选规则的磁盘,首行填充全量字段,同虚拟机后续磁盘行仅保留磁盘名称字段,其余重复字段留空;同时将逐行追加写入CSV改为全量数据收集后一次性导出,提升运行稳定性。
修改后可直接运行的完整代码
# 初始化报告数组统一收集所有输出行 $allReports = @() $myVMs = @(Get-VM -Server $vc | Where-Object {$_.PowerState -eq 'PoweredOn'} | Select-Object -Unique) foreach ($myVM in $myVMs){ $VMDKs = $myVM | Get-HardDisk # 标记位:标识当前是否为该虚拟机下第一块符合筛选条件的磁盘 $isFirstMatchedDisk = $true foreach ($VMDK in $VMDKs) { if ($null -ne $VMDK){ $Diskmode = $VMDK.Persistence if($Diskmode -ne 'Persistent'){ if ($isFirstMatchedDisk) { # 首块匹配磁盘填充全部字段 $Report = [PSCustomObject] @{ Name = $myVM.name Server = $vc PowerState = $myVM.PowerState Disk = $VMDK.Name DiskMode = $VMDK.Persistence } # 更新标记位,后续同虚拟机磁盘不再填充重复字段 $isFirstMatchedDisk = $false } else { # 同虚拟机后续匹配磁盘仅保留Disk字段,其余字段留空 $Report = [PSCustomObject] @{ Name = '' Server = '' PowerState = '' Disk = $VMDK.Name DiskMode = '' } } $allReports += $Report } } } } # 全量数据收集完成后一次性导出CSV文件 $allReports | Export-CSV -NoTypeInformation $File -Encoding UTF8
关键改动说明
- 新增
$allReports数组统一收集所有输出记录,替代原代码逐行调用Export-CSV -Append的写法,减少磁盘IO次数,避免多次追加写入可能引发的文件占用、格式错乱问题 - 单台虚拟机的磁盘遍历逻辑前新增
$isFirstMatchedDisk布尔标记,初始值设为$true,用于识别当前处理的是否为该虚拟机下第一块非持久化磁盘 - 生成报告对象时新增分支判断:首块匹配磁盘填充Name、Server、PowerState、Disk、DiskMode全字段,随后将标记位设为
$false;同虚拟机后续匹配磁盘仅给Disk字段赋值,其余重复字段赋值为空字符串 - 所有虚拟机遍历完成后,将收集到的全量报告一次性导出为CSV,默认使用UTF8编码保证多语言兼容性,简体中文环境如果需要用Excel直接打开无乱码,可将
-Encoding UTF8替换为-Encoding Default
内容的提问来源于stack exchange,提问作者Empty Coder
相关产品推荐
相关产品推荐

