You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PowerShell如何将Select-String返回的哈希表转为可访问属性的对象

问题根源

你用Select-String处理结构化对象是错误的用法:Select-String是设计用来处理文本/字符串的,当你把AD用户对象传给它时,PowerShell会自动将对象转为字符串(也就是你看到的@{Name=xxx; samAccountName=xxx}格式),返回的结果是MatchInfo类型的文本匹配对象,自然无法直接访问原对象的属性。


最优方案:直接用对象过滤(无需额外转换)

不要用Select-String做对象过滤,换成PowerShell专门用来过滤结构化对象的Where-Object即可,一步得到可直接访问属性的对象列表:

# 假设$whitelist是白名单samAccountName的数组
$myNewObject = Get-ADUser -Filter * -Server $domain | Select-Object Name, samAccountName | Where-Object {
    # 过滤samAccountName不在白名单内的用户
    $_.samAccountName -notin $whitelist
}

# 直接遍历访问属性
ForEach ($user in $myNewObject) { 
    Write-Host $user.Name 
}

如果你的$whitelist是正则表达式规则,把过滤条件改成$_.samAccountName -notmatch $whitelist即可。


兼容方案:转换现有Select-String的结果为可访问对象

如果你必须要处理已经用Select-String得到的结果,可以把匹配到的文本字符串转为PS自定义对象:

$myNewObject = $checkUsers | ForEach-Object {
    # 取出匹配到的原始文本行,去掉首尾的@{}字符
    $rawStr = $_.Line.Trim('@{}')
    # 拆分键值对存入哈希表
    $propHash = [ordered]@{}
    foreach ($pair in $rawStr -split '; ') {
        $key,$value = $pair -split '=', 2
        $propHash[$key] = $value
    }
    # 哈希表转自定义对象
    [PSCustomObject]$propHash
}

# 转换后即可正常访问属性
ForEach ($user in $myNewObject) { Write-Host $user.Name }

内容的提问来源于stack exchange,提问作者Archangel

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 09:21:00