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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.06 19:57:40