PowerShell解析对象生成PSCustomObject的报错问题求助
问题分析与解决方案
首先来看你遇到的报错:德语提示的核心是设置属性时传入的name参数无效,结合你的代码片段$ReturnObjekt."$($_.Name)" += $o.Rows[$_],大概率是这几个原因:
- 你试图给单个
PSCustomObject的属性用+=追加元素,但该属性并未初始化为数组类型,PowerShell无法直接对非数组属性执行追加操作; - 你的逻辑方向有误——你试图构建一个包含数组属性的对象,而不是生成多个单行对象,这和你想要的最终输出结构不符。
正确实现方案
我们的核心思路是:按索引遍历所有列的数组元素,为每个索引位置生成一个独立的PSCustomObject,这样就能得到你需要的多行对应结构。以下是完整的可运行代码:
function Convert-ColumnArrayToRows { param( [Parameter(Mandatory=$true)] $InputObject ) # 提取列名和对应的行数组集合 $columnNames = $InputObject.Columns.Name $rowArrays = $InputObject.Columns.Rows # 确定最大的行数(兼容列数组长度不一致的情况) $maxRowCount = ($rowArrays | Measure-Object -Property Length -Maximum).Maximum # 遍历每个索引,生成单行对象 for ($i = 0; $i -lt $maxRowCount; $i++) { # 使用有序哈希表保持列的原始顺序 $rowProperties = [ordered]@{} foreach ($colIndex in 0..($columnNames.Count - 1)) { # 获取当前列第i个元素,如果索引超出数组长度则返回$null $currentValue = if ($i -lt $rowArrays[$colIndex].Length) { $rowArrays[$colIndex][$i] } else { $null } $rowProperties[$columnNames[$colIndex]] = $currentValue } # 转换为PSCustomObject输出 [PSCustomObject]$rowProperties } } # 调用示例(模拟你的$Objekt结构) $sampleObj = [PSCustomObject]@{ Columns = @( [PSCustomObject]@{ Name = "Addr.BoNumber"; Rows = @(212, 210, 211, 104) } [PSCustomObject]@{ Name = "Addr.FullName"; Rows = @("xy", "cv", "bn", "mm") } ) } # 执行转换并输出 Convert-ColumnArrayToRows -InputObject $sampleObj
代码解释
- 提取核心数据:从
$InputObject.Columns中分离出列名集合和对应的行数组集合; - 处理长度不一致:通过
Measure-Object获取最长的数组长度,避免因列数组长度不同导致索引越界; - 生成单行对象:
- 用
[ordered]@{}确保输出的列顺序和原始结构一致; - 遍历每个列索引,取出对应位置的元素(如果索引超出当前列数组长度则设为
$null); - 将有序哈希表转换为
PSCustomObject,每个索引位置生成一个独立对象。
- 用
输出效果
运行上述示例代码后,输出会和你期望的完全一致:
Addr.BoNumber Addr.FullName ------------- ------------- 212 xy 210 cv 211 bn 104 mm
内容的提问来源于stack exchange,提问作者SimonS
相关产品推荐
相关产品推荐

