如何在PowerShell计算列的Expression块中获取对应条目的Name属性值
计算列Expression脚本块的Name值获取说明
原生能力边界
- PowerShell 对计算列的原生执行逻辑,不支持直接在Expression脚本块内部获取当前列对应的Name属性值
原因是Select-Object在初始化阶段会提前拆分所有计算列定义的Name、Expression值单独缓存,执行Expression时仅会把管道当前处理的对象通过
$_传入脚本块,不会把当前列自身的元信息(比如Name值)注入到脚本块的作用域中,没有内置的上下文变量可以直接拿到这个值。
适配场景的零重复实现方案
你遇到的需要在Name和Expression里重复输入相同组名、容易拼写不一致的问题,完全可以通过预生成计算列的方式从根源解决,不需要反复复制相同的组名字符串:
- 核心思路是把需要校验的组名整理成独立的字符串数组,在循环生成计算列时,直接把当前循环的组名同时作为列的Name值、以及Expression里要传的组参数值。
- 写这类循环生成逻辑必须给Expression脚本块加
.GetNewClosure()方法,否则脚本块会在循环结束后捕获最后一次循环的组名值,导致所有列的判断逻辑都指向最后一个组,出现结果完全错误的典型bug。
实现代码示例
# 所有需要校验的组名只需要在这里写一次,无重复 $targetGroups = "Administrators","Domain Admins","Enterprise Admins","Schema Admins" # 自动生成Select-Object可直接识别的计算列定义 $groupColumns = foreach ($group in $targetGroups) { @{ Name = $group Expression = { Test-ADGroupMembership -User $_.sAMAccountName -Group $group }.GetNewClosure() } } # 直接传入Select-Object即可,输出效果和手动写4个哈希表完全一致 Get-ADUser -Filter * | Select-Object sAMAccountName, $groupColumns
如果后续需要在多个脚本里复用这段逻辑,可以把生成列的逻辑封成一个轻量辅助函数,后续调用会更方便:
function New-ADGroupMembershipColumn { param( [Parameter(Mandatory)] [string[]]$GroupName ) foreach ($group in $GroupName) { [PSCustomObject]@{ Name = $group Expression = { Test-ADGroupMembership -User $_.sAMAccountName -Group $group }.GetNewClosure() } } }
使用时只需要传组名数组即可,完全不需要手动构造计算列的哈希表。
内容的提问来源于stack exchange,提问作者rga.cz
相关产品推荐
相关产品推荐

