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