构建自定义对象时避免属性名称冲突

时间:2017-03-02 14:26:44

标签: powershell

我正在使用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

1 个答案:

答案 0 :(得分:1)

如果属性已经定义,则将属性转换为动态数组:

$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 { .... }

另一个优点是我们不那么频繁地调用缓慢的Add-Member。