PowerShell中使用计算属性匹配列表添加友好名称列问题
解决PowerShell列表匹配合并问题
问题分析
你的原代码存在两个核心问题:
- 计算属性脚本块中嵌套
ForEach-Object完全多余——脚本块本身就是针对$serviceusage2的每个对象执行的,$_已经代表当前处理的对象。 - 匹配逻辑错误:
$spdata中不存在Servicename列,正确的匹配字段是ServicePlanName,且你用索引的方式无法实现正确的匹配筛选。
解决方案
方案1:直接在计算属性中筛选匹配(适合数据量较小的场景)
$serviceusage2 | Select-Object ServiceName, @{Name='FriendlyName'; Expression={ ($spdata | Where-Object ServicePlanName -eq $_.ServiceName).ServicePlanDisplayName }}, ActivatedUsers
逻辑说明:针对$serviceusage2的每个对象,从$spdata中筛选出ServicePlanName与当前对象ServiceName一致的项,提取其ServicePlanDisplayName作为新列FriendlyName。
方案2:先构建哈希表映射(适合数据量较大的场景,提升匹配效率)
如果$spdata数据量较多,每次循环都执行筛选会拖慢速度,建议先构建一个映射哈希表:
# 构建ServicePlanName到ServicePlanDisplayName的映射哈希表 $spNameMap = @{} $spdata | ForEach-Object { $spNameMap[$_.ServicePlanName] = $_.ServicePlanDisplayName } # 基于哈希表快速匹配合并 $serviceusage2 | Select-Object ServiceName, @{Name='FriendlyName'; Expression={ $spNameMap[$_.ServiceName] }}, ActivatedUsers
逻辑说明:先把$spdata中的ServicePlanName作为键、ServicePlanDisplayName作为值存入哈希表,后续直接通过键取值,匹配效率大幅提升。
内容的提问来源于stack exchange,提问作者Jim842
相关产品推荐
相关产品推荐

