我有一堆字符串是来自AD的DN组。我需要拔出Common Name。 示例字符串是“CN =我想要的组名,OU =组容器,DC = corp,DC =测试,DC =本地”
我正在寻找的是一些PowerShell代码,它将从该字符串中拉出“我想要的群组名称”并丢弃其余部分。
我可以用这个
来扯掉CN$s = "CN=Group Name I Want,OU=Group Container,DC=corp,DC=test,DC=local"
$s = $s.Remove(0,3)
但在那之后,我没有一个好的方法可以从“,OU”开始扯掉everthing
我确信有一些正则表达式可以做到这一点,但我需要一些帮助来搞清楚。
答案 0 :(得分:7)
$s = "CN=Group Name I Want,OU=Group Container,DC=corp,DC=test,DC=local"
$s -replace "(CN=)(.*?),.*",'$2'
答案 1 :(得分:1)
jon Z答案的更短变化:
$s = "CN=Group Name I Want,OU=Group Container,DC=corp,DC=test,DC=local"
$s = $s -replace '^CN=|,.*$'
^
和$
是字符串开头和结尾锚点。 |
是“或”。
匹配是行开头的CN=
或一个以逗号开头并到达行尾的字符串(即CN之后的所有内容)。 replace
正在替换为空,因此您将丢弃所有匹配项,只留下CN本身。
如果您的CN(呃)中有逗号,那么不显然会有效。
假设这样的逗号后面跟一个空格,这对前面的例子(\S
- 非空格字符)来说都可以正常工作:
$s = $s -replace '^CN=|,\S.*$'
我测试了jon Z或者这种变化是否更快执行。拥有1,470,000个DN,第一个执行36.87秒,其中一个执行34.75。其中并不是很多。
那是从文件中读取DN。奇怪的是,将文件“啜饮”成一个数组并执行该文件会使两个正则数据更长一分钟。 PC没有内存限制 - 文件只有100MB。现在不能打扰到那个人的底部!
答案 2 :(得分:0)
$s = "CN=Group Name I Want,OU=Group Container,DC=corp,DC=test,DC=local"
$s1 = ($s -split ",*..=")[1]
$s1
答案 3 :(得分:0)
$s = "CN=Hall\, Jeremy,OU=Group Container,DC=corp,DC=test,DC=local"
$s1 = ($s -split ",*..=")[1]
$s1
这适合我 - 但是,我有一个\,名字输出。 (我从get-aduser函数中拉出manager属性,然后打印distinguishedName.Hall \,Jeremy就是我剩下的一个例子。
有人想要刺?
答案 4 :(得分:0)
$DN = Get-ADUser Username -Properties * | Select DistinguishedName | ForEach-Object {($_.DistinguishedName) -replace('\\','')}
$OUTemp = $DN -creplace "^[^,]*,",""
$OU = $OUTemp -creplace "^[^,]*,",""
$OU
经过大量搜索,这对我有用。我并不为第2行和第3行的冗余感到自豪,但我不知道如何让它在单行上工作。
第一行末尾的“-replace”处理了格式为CN = LastName \的DistinguishedNames,当存在\ escape字符时为FirstName。如果没有它,它不会在名义上产生负面影响。
我的$ OU的结果是OU = ChildOU2,OU = ChildOU1,OU = ParentOU,DC = DOMAIN,DC = local
答案 5 :(得分:-1)
使用此主题中的各种答案,我想出了以下内容:
$ s =($ s -split“,* .. =”)[1]
$ s = $ s.Remove($ s.IndexOf(“\”),1)
$ S