PowerShell:Export-CSV移至循环外仅导出最后一行,如何调整?
解决PowerShell循环外导出CSV仅保留最后一行的问题
我看你遇到的问题很典型——把导出CSV的代码移到foreach循环外之后,结果只保留了最后一行,连$results变量里也只有最后一条数据。这问题出在你对数组初始化的时机上,咱们一步步来改:
问题根源
你在foreach循环内部写了$results = @(),这意味着每次循环都会把$results重置为空数组。不管之前加了多少内容,下一次循环一开始就被清空了,最后自然只剩最后一次循环生成的对象。
修改后的完整代码
# 先初始化结果数组,放在循环外面! $results = @() $vms = Get-VM | Where { $_.State –eq 'Running' } | Select-Object -ExpandProperty Name $comp = Get-WmiObject Win32_ComputerSystem | Select-Object -ExpandProperty name foreach($vm in $vms) { # Get network interface details $out = Get-VMNetworkAdapter -vmname $vm | select VMName, MacAddress, IPAddresses $vm_name = $out.VMName | Get-Unique $ip = ($out.IPAddresses | ForEach-Object { $_ | ? {$_ -notmatch ':'} }) -join " " # 格式化MAC地址并拼接 $mac = ($out.MacAddress | ForEach-Object { $_.Insert(2,":").Insert(5,":").Insert(8,":").Insert(11,":").Insert(14,":") }) -join ' ' $obj = New-Object -TypeName psobject $obj | Add-Member -MemberType NoteProperty -Name "VM NAME" -Value $vm_name $obj | Add-Member -MemberType NoteProperty -Name "IP ADDRESS" -Value $ip $obj | Add-Member -MemberType NoteProperty -Name "MAC ADDRESS" -Value $mac $obj | Add-Member -MemberType NoteProperty -Name "HYPER-V HOST" -Value $comp # 把当前对象添加到结果数组里,不要每次都重置数组 $results += $obj } # 循环结束后统一导出所有数据,不用-append了 $results | Export-Csv -Path "c:\1.csv" -NoTypeInformation # 也可以一次性输出所有结果 Write-Output $results
关键改动说明
- 把
$results = @()移到循环外:这样数组只会初始化一次,每次循环只是往里面添加新对象,不会清空之前的内容。 - 把
$comp的获取移到循环外:因为Hyper-V主机名是固定的,没必要每次循环都去查一次,提升效率。 - 移除循环内的
Write-Output和Export-Csv:循环里只负责收集数据,最后统一处理,既高效又避免重复写入文件。 - 去掉
-append参数:因为现在是一次性写入所有数据,不需要追加,直接覆盖或者创建新文件即可(如果文件存在会覆盖,需要的话可以先判断文件是否存在)。
这样修改后,$results数组就会包含所有虚拟机的信息,循环外导出CSV也能保存全部行了。
内容的提问来源于stack exchange,提问作者overflowed
相关产品推荐
相关产品推荐

