Powershell 在生成自定义对象时避免属性名称冲突

Powershell 在生成自定义对象时避免属性名称冲突,powershell,Powershell,我正在使用PowerShell刮取网页,并从页面上的表元素构建对象。有时每个表元素是唯一的,有时有多个同名的元素 如果在刮取过程中,我碰到了一个属性的第二个实例,我想用数字命名这个新属性,如果我再次碰到这个名称,则继续这个序列 我已经按照下面的代码成功地实现了这一点,但是有更好的方法吗 $PropertyExists = $Object.PSObject.Properties.Name | Where { $_ -like "$PropertyName*" } | Sort -Desce

我正在使用PowerShell刮取网页,并从页面上的表元素构建对象。有时每个表元素是唯一的,有时有多个同名的元素

如果在刮取过程中,我碰到了一个属性的第二个实例,我想用数字命名这个新属性,如果我再次碰到这个名称,则继续这个序列

我已经按照下面的代码成功地实现了这一点,但是有更好的方法吗

$PropertyExists = $Object.PSObject.Properties.Name |
    Where { $_ -like "$PropertyName*" } | Sort -Descending | Select -First 1   

If ($PropertyExists) { 
    $PropertyNumber = [int]($PropertyExists -split "(\d+$)")[1] + 1 
} Else {
    $PropertyNumber = "" 
}

$Object | Add-Member –MemberType NoteProperty 
    –Name "$PropertyName$PropertyNumber" 
    –Value $PropertyValue

将属性转换为动态数组(如果已定义):

$prop = $Object.$PropertyName
if ($prop -is [Collections.ArrayList]) {
    $prop.Add($PropertyValue) >$null
} elseif ($prop -is [object]) {
    $Object.$PropertyName = [Collections.ArrayList]@($prop, $PropertyValue)
} else {
    Add-Member @{$PropertyName = $PropertyValue} -InputObject $Object
}
因此,您将能够统一处理单值和多值属性:

$Object.foo | ForEach { .... }

另一个优点是,我们调用慢添加成员的频率要低得多。

非常好的解决方案,谢谢!唯一的一个小问题是,您的代码假设属性总是有内容,在我的场景中,它们有时是空白的,但我通过将elseif$prop更改为elseif$prop-is[object]解决了这个问题。