3

我有一份来自 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返回以下内容:

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
4

4 回答 4

7

我决定把我的评论变成一个答案:

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

正则表达式可视化

调试演示

这将正确处理作为第一个组件一部分的转义逗号。

我们对字符串开头的一个或多个字符进行非贪婪匹配,然后查找前面没有反斜杠的逗号(以便点将匹配反斜杠和逗号组合并继续)。

于 2015-05-01T14:51:40.293 回答
3

您可以使用如下替换删除第一个元素:

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

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

于 2015-05-01T12:19:04.460 回答
1

类似于 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 "^,"
于 2015-05-01T12:26:22.630 回答
1

每个用户有 7 个项目,用逗号分隔,并且您想去掉第一个。

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

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

如果你然后输入$DNList它返回

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
于 2015-05-01T12:10:02.563 回答