PowerShell解析Yammer报表@{}格式stats字段提取members值
问题根因
你看到的@{members=xxx; aad_guests=xxx; ...}格式不是结构化的哈希表、数组、JSON类型,是PowerShell执行Export-Csv时,对复杂嵌套属性调用.ToString()方法生成的纯文本字符串。
你的导出脚本里,stats字段本是Yammer API返回的JSON转换后的嵌套对象,Export-Csv不支持直接把嵌套对象写入CSV单元格,会自动将对象转成上述格式的字符串存储。你读回CSV时拿到的stats字段只是普通文本,不是可直接取属性的对象,这就是你之前用-ExpandProperty、where等方法始终拿不到members值的原因。
解决方案
方案1:修改原始导出脚本(推荐,从根源避免格式问题)
导出CSV前提前把stats里需要的字段拆成顶层独立列,就不会出现对象自动转字符串的问题,只需修改脚本最后导出数据的部分:
$users = Get-YamUsers $users | Select-Object id, name, full_name, web_url, privacy, external, state, creator_id, created_at, last_message_at, @{Name='members';Expression={$_.stats.members}}, @{Name='aad_guests';Expression={$_.stats.aad_guests}}, @{Name='updates';Expression={$_.stats.updates}}, @{Name='last_message_id';Expression={$_.stats.last_message_id}}, @{Name='stats_last_message_at';Expression={$_.stats.last_message_at}} | Export-Csv f:\tmp\YammerGroupInfo.csv -NoTypeInformation
修改后导出的CSV会直接包含独立的members列,读取时直接访问$YMy.members就能拿到成员计数值,无需额外解析。
方案2:解析已生成的现有CSV文件
如果已经生成了CSV文件,不想重新调用接口拉取数据,可以用正则表达式直接从stats字段的字符串中提取members值,修改读取脚本如下:
$YamMy = Import-Csv .\YammerGroupInfo.csv | Sort-Object "full_name" -Descending Foreach ($YMy in $YamMy){ $groupName = $YMy.full_name $privacy = $YMy.privacy # 正则匹配members=后的数字,直到遇到分号或字段结尾 if ($YMy.stats -match 'members=(\d+)') { $memberCount = $matches[1] } # 后续逻辑直接使用$memberCount即可 }
该正则匹配逻辑不受其他字段空值、格式变化影响,可稳定提取成员数值。
内容的提问来源于stack exchange,提问作者IfEyeOnlyKnew
相关产品推荐
相关产品推荐

