PowerShell左连接后如何配置条件性Name属性
PowerShell左连接中动态设置Name属性的解决方案
你遇到的问题核心是:在LeftJoin的-Property参数中,直接编写的If语句会在定义哈希表时就立即执行,而非在每条记录匹配时动态判断。正确的做法是用**脚本块({})**包裹逻辑,让它在处理每条记录时再执行,这样才能正确访问当前的$Left和$Right对象。
修正后的代码
把原来的Name属性定义改成脚本块形式:
$objectA = @( @{ "Id"="1" "Name"="Bob" }, @{ "Id"="2" "Name"="Bill" }, @{ "Id"="3" "Name"="Ted" } ) $objectB = @( @{ "Id"="2" "Name"="John" } ) $objectA | LeftJoin $objectB -On Id -Property @{ID = 'Left.ID'}, @{Name = { if ($null -ne $Right) { $Right.Name } else { $Left.Name } }} | Format-Table
输出结果
执行后会得到你期望的结果:
ID Name -- ---- 1 Bob 2 John 3 Ted
关键说明
- 当使用
LeftJoin时,-Property参数的哈希表值如果是字符串,会直接被解析为固定的字段引用;如果是脚本块,则会在每条记录匹配时执行,此时$Left代表左表当前记录,$Right代表右表匹配到的记录(无匹配时为$null)。 - 用
$null -ne $Right判断是否存在右表匹配记录,是PowerShell中更安全的空值判断方式,可避免因对象类型导致的误判。
内容的提问来源于stack exchange,提问作者Jim Davis
相关产品推荐
相关产品推荐

