如何拆分专有名称?

How to Split DistinguishedName?

我有一份来自 AD 的人员列表和他们的 DN(我没有直接访问该 AD 的权限)。他们的 DN 格式为:

$DNList = 'CN=Bob Dylan,OU=Users,OU=Dept,OU=Agency,OU=NorthState,DC=myworld,DC=com',
          'CN=Ray Charles,OU=Contractors,OU=Dept,OU=Agency,OU=NorthState,DC=myworld,DC=com',
          'CN=Martin Sheen,OU=Users,OU=Dept,OU=Agency,OU=WaySouth,DC=myworld,DC=com'

我想 $DNList return 如下:

OU=Users,OU=Dept,OU=Agency,OU=NorthState,DC=myworld,DC=com
OU=Contractors,OU=Dept,OU=Agency,OU=NorthState,DC=myworld,DC=com
OU=Users,OU=Dept,OU=Agency,OU=WaySouth,DC=myworld,DC=com

每个用户有 7 个项目,逗号分隔,您想要删除第一个。

因此,使用逗号作为分隔符拆分数组中的每个项目,return 匹配 1-6(0 是您要跳过的第一个项目),然后再次用逗号连接,例如

$DNList = $DNList|foreach{($_ -split ',')[1..6] -join ','}

如果再输入$DNList就returns

OU=Users,OU=Dept,OU=Agency,OU=NorthState,DC=myworld,DC=com
OU=Contractors,OU=Dept,OU=Agency,OU=NorthState,DC=myworld,DC=com
OU=Users,OU=Dept,OU=Agency,OU=WaySouth,DC=myworld,DC=com

您可以用这样的替换删除第一个元素:

$DNList -replace '^.*?,(..=.*)$', ''

^.*?,是从字符串开头到逗号的最短匹配。
(..=.*)$ 匹配字符串的其余部分(从逗号后的两个字符开始,后跟 = 字符)并将它们分组,以便在替换中可以引用匹配项作为

类似于 Grahams 的答案,但删除了硬编码的数组值,因此它只会删除 CN 部分,而不用担心 DN 有多长。

$DNList | ForEach-Object{($_ -split "," | Select-Object -Skip 1) -join ","}

Ansgar 很可能有一个很好的理由,但您可以使用正则表达式删除第一个逗号之前的每个

$DNList -replace "^.*?,"

根据 briantist 更新

为了保持一个不同的答案但这个正则表达式仍然有效,但我怀疑这些字符会出现在用户名中

$DNList -replace "^.*?,(?=OU=)"

正则表达式使用前瞻性来确保 , 后跟 OU=

同样你可以这样做

($DNList | ForEach-Object{($_ -split "(,OU=)" | Select-Object -Skip 1) -join ""}) -replace "^,"

我决定将我的评论变成答案:

$DNList | ForEach-Object {
    $_ -replace '^.+?(?<!\),',''
}

Debuggex Demo

这将正确处理第一个组件中的转义逗号。

我们对字符串开头的一个或多个字符进行非贪婪匹配,然后寻找前面没有反斜杠的逗号(这样点会匹配反斜杠和逗号的组合并保留去)。