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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 14:50:01