我有一堆字符串,它们是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