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
相关产品推荐
相关产品推荐

