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

向迭代ArrayList添加非标值:PowerShell注册表脚本CSV导出异常

问题分析

你遇到的核心问题确实是两种对象的结构不一致,再加上一个隐藏的小问题:当Get-RegValue返回多个注册表项对象时,你直接用$DataList.Add($RegData)会把整个对象数组作为单个元素加入集合,导致最终的$DataList混合了单个对象和数组元素——这不仅让输出格式混乱,也会让Export-Csv无法正确识别统一的列结构。

另外,Get-RegValue返回的原生对象和你自定义的PSCustomObject可能存在属性差异(比如你自定义的对象包含Type属性,但原生对象可能缺失这个属性,或者属性顺序/名称不匹配),这也会导致PowerShell无法统一渲染输出,CSV导出自然失败。

解决方案

我们需要做两件关键的事来修复:

  1. 确保所有加入$DataList的对象都具有完全相同的属性集合和名称,统一转换成PSCustomObject。
  2. 正确处理Get-RegValue返回的对象集合,逐个添加到列表中(而不是把整个集合作为单个元素添加)。

修改后的脚本如下:

$DataList = New-Object System.Collections.ArrayList
foreach ($Target in $ImportData) {
    Write-Host "Scanning" $Target.ComputerName ":" -NoNewline
    $RegData = Get-RegValue -ComputerName $($Target.ComputerName) -Hive $RegHive -Key $KeyName
    
    if (!$RegData) {
        Write-Host "No data found for" $Target.ComputerName
        # 添加统一结构的无数据条目
        [void]$DataList.Add([PSCustomObject]@{
            ComputerName = $Target.ComputerName
            Hive         = "No Data"
            Key          = ""
            Value        = ""
            Data         = ""
            Type         = ""
        })
    } else {
        # 遍历Get-RegValue返回的每个对象,转换为统一结构
        foreach ($regItem in $RegData) {
            [void]$DataList.Add([PSCustomObject]@{
                ComputerName = $regItem.ComputerName
                Hive         = $regItem.Hive ?? "No Data"  # 空值时用默认值兜底
                Key          = $regItem.Key ?? ""
                Value        = $regItem.Value ?? ""
                Data         = $regItem.Data ?? ""
                Type         = $regItem.Type ?? ""  # 确保Type属性存在,原生对象缺失时设为空
            })
        }
        Write-Host "Done"
    }
}

# 现在可以正常导出CSV了
$DataList | Export-Csv -Path ".\RegistryResults.csv" -NoTypeInformation -Encoding UTF8
$DataList
关键修改点说明
  • 统一对象结构:不管是无数据的自定义条目,还是从注册表获取的条目,都转换成具有相同6个属性的PSCustomObject,确保PowerShell能识别统一的列。
  • 处理对象集合:用foreach ($regItem in $RegData)遍历每个注册表项,逐个添加到列表,避免把整个数组作为单个元素加入$DataList。
  • 空值兜底:用??空合并运算符为可能缺失的属性设置默认值(比如如果Get-RegValue返回的对象没有Type属性,就设为空字符串),保证每个属性都有值。

这样修改后,你的输出会保持统一的表格格式,Export-Csv也能正确导出所有列的数据,不会再出现格式混乱的问题。

内容的提问来源于stack exchange,提问作者Scepticalist

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 09:26:32