You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.13 23:28:12