如何使用正则表达式仅从具有PowerShell的可分辨名称中提取CN



我有一堆字符串,它们是AD组中的DN。我需要拔出公用名。示例字符串是"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"开始撕掉所有的东西

我确信有一些正则表达式可以做到这一点,但我需要一些帮助来弄清楚。

$s = "CN=Group Name I Want,OU=Group Container,DC=corp,DC=test,DC=local"
$s -replace "(CN=)(.*?),.*",'$2'

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。现在懒得去了解那个!

$s = "CN=Group Name I Want,OU=Group Container,DC=corp,DC=test,DC=local"
$s1 = ($s -split ",*..=")[1]
$s1
$s = "CN=Hall, Jeremy,OU=Group Container,DC=corp,DC=test,DC=local"
$s1 = ($s -split ",*..=")[1]
$s1

这对我有用 - 但是,我在名称输出中留下了一个 \。 (我正在从 get-aduser 函数中提取管理器属性,它打印了区分名称。 霍尔,杰里米是我剩下的一个例子。

有人想刺一刀吗?

使用此线程中的各种答案,我想出了以下内容:

$s = ($s -拆分 ",*..="([1]

$s = $s.Remove($s.IndexOf("\"(,1(

$s

$DN = Get-ADUser Username -Properties * | Select DistinguishedName | ForEach-Object {($_.DistinguishedName) -replace('\','')}
$OUTemp = $DN -creplace "^[^,]*,",""
$OU = $OUTemp -creplace "^[^,]*,",""
$OU

经过大量搜索,这对我有用。我对第 2 行和第 3 行的冗余并不自豪,但我不知道如何让它在一行上工作。

第一行末尾的"-replace"负责处理格式化为 CN=LastName\、FirstName 的可分辨名称(当存在 \ 转义字符时(。它不会对名称产生负面影响。

我的$OU的结果是 OU=ChildOU2,OU=ChildOU1,OU=ParentOU,DC=DOMAIN,DC=local

最新更新