You need to enable JavaScript to run this app. 如何在PowerShell计算列的Expression块中获取对应条目的Name属性值
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.29 05:15:03