PowerShell脚本求助:如何修剪计算机可分辨名称列表?
PowerShell 处理AD可分辨名称:移除第一个OU之前的内容
原代码的问题
你使用的TrimStart("OU")是按字符集合移除字符串开头的字符,而非匹配完整的"OU"子串。它会把开头所有属于"OU"字符集的单个字符(O和U)逐一移除,完全达不到你要精准截取第一个OU起始位置的需求。
解决方案1:正则表达式替换(最简洁)
直接通过正则匹配第一个OU=之前的所有内容,替换为保留OU=开头的部分:
$OUlists = Get-ADGroupMember -Identity "Test-group" | Select-Object -ExpandProperty distinguishedname | Sort-Object distinguishedname $OUlists | ForEach-Object { $_ -replace '^.*?(OU=)', '$1' }
- 正则逻辑:
^.*?(OU=)从字符串开头开始,用非贪婪模式匹配任意字符,直到找到第一个OU=为止;$1代表匹配到的OU=,替换后就保留了从第一个OU开始的完整后缀。
解决方案2:IndexOf + Substring(更直观)
通过定位第一个OU=的起始索引,直接截取后续内容:
$OUlists = Get-ADGroupMember -Identity "Test-group" | Select-Object -ExpandProperty distinguishedname | Sort-Object distinguishedname $OUlists | ForEach-Object { $ouStart = $_.IndexOf("OU=") if ($ouStart -ge 0) { $_.Substring($ouStart) } # 可选:如果没有OU=的条目,返回原字符串或自定义处理 else { $_ } }
IndexOf("OU=")返回第一个OU=子串的起始位置,Substring从该位置开始截取,直接得到目标内容;添加判断是为了避免无OU的条目报错。
补充:Split分割拼接的方式(备选)
如果偏好通过分割字符串处理,也可以先按逗号拆分,再拼接从第一个OU开始的部分:
$OUlists = Get-ADGroupMember -Identity "Test-group" | Select-Object -ExpandProperty distinguishedname | Sort-Object distinguishedname $OUlists | ForEach-Object { $dnParts = $_.Split(',') $firstOuIndex = $dnParts | ForEach-Object { if ($_ -match '^OU=') { return $dnParts.IndexOf($_) } } if ($firstOuIndex -ne $null) { $dnParts[$firstOuIndex..($dnParts.Count-1)] -join ',' } else { $_ } }
内容的提问来源于stack exchange,提问作者NuckinFutz
相关产品推荐
相关产品推荐

