如何在For循环中为PSCustomObject添加不同命名的属性
解决PSCustomObject添加多属性的问题
问题原因分析
- 第一种写法的问题:每次循环都重新创建
$ExternalUserDetails对象,之前添加的属性会被完全覆盖,最终只剩最后一次循环添加的属性。 - 第二种写法的问题:循环中每次生成一个仅含单个属性的新对象,最终
$ExternalUserDetails是一组对象的数组,而非单个包含所有属性的对象;同时属性名写错了,应该用$ExternalUserDetail而非$ExternalUserDetails。
正确写法1:先初始化对象,循环添加属性
# 先初始化空的PSCustomObject $ExternalUserDetails = [pscustomobject]@{} foreach($ExternalUserDetail in $ExternalUserDetailsNeeded) { $Matches = $null $DetailStartPosition = $TextBoxText.IndexOf($ExternalUserDetail) if($DetailStartPosition -ne -1) { $ExternalUserDetailEscaped = [Regex]::Escape($ExternalUserDetail) $TextBoxText.Substring($DetailStartPosition) -match "(?s)$ExternalUserDetailEscaped\r?\n([^\r\n]*)" | Out-Null # 直接给已存在的对象添加属性,无需重新创建 Add-Member -InputObject $ExternalUserDetails -MemberType NoteProperty -Name $ExternalUserDetail -Value $Matches[1] } }
正确写法2:先构建哈希表,再转成PSCustomObject(更高效)
$detailHash = @{} foreach($ExternalUserDetail in $ExternalUserDetailsNeeded) { $Matches = $null $DetailStartPosition = $TextBoxText.IndexOf($ExternalUserDetail) if($DetailStartPosition -ne -1) { $ExternalUserDetailEscaped = [Regex]::Escape($ExternalUserDetail) $TextBoxText.Substring($DetailStartPosition) -match "(?s)$ExternalUserDetailEscaped\r?\n([^\r\n]*)" | Out-Null # 把键值对存入哈希表 $detailHash[$ExternalUserDetail] = $Matches[1] } } # 一次性将哈希表转换为PSCustomObject $ExternalUserDetails = [pscustomobject]$detailHash
说明
两种写法都能将所有匹配到的键值对作为属性添加到同一个PSCustomObject中。第二种用哈希表预存数据再转换的方式,比循环调用Add-Member性能更好,尤其当属性数量较多时优势更明显。
内容的提问来源于stack exchange,提问作者user66001
相关产品推荐
相关产品推荐

