Как я могу использовать Regex, чтобы извлечь только CN из отличительного имени с PowerShell - PullRequest
3 голосов
/ 04 января 2012

У меня есть несколько строк, которые представляют собой DN групп из AD.Мне нужно вытащить общее имя.Пример строки: «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"

Я уверен, что есть некоторые регулярные выражения, которые сделают это, но мне нужна помощь, чтобы понять это.

Ответы [ 6 ]

7 голосов
/ 04 января 2012
$s = "CN=Group Name I Want,OU=Group Container,DC=corp,DC=test,DC=local"
$s -replace "(CN=)(.*?),.*",'$2'
1 голос
/ 12 февраля 2017

Еще более короткий вариант ответа 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 из файла.Как ни странно, «накапливая» файл в массив и выполняя его, это заняло оба регулярных выражения на минуту дольше.ПК не был связан с памятью - файл был только 100 МБ.Не могу быть обеспокоен тем, чтобы добраться до сути этого прямо сейчас!

0 голосов
/ 20 ноября 2015
$DN = Get-ADUser Username -Properties * | Select DistinguishedName | ForEach-Object {($_.DistinguishedName) -replace('\\','')}
$OUTemp = $DN -creplace "^[^,]*,",""
$OU = $OUTemp -creplace "^[^,]*,",""
$OU

Это сработало для меня после долгих поисков.Я не горжусь избыточностью в строках 2 и 3, но я не знаю, как заставить это работать на одной строке.

"-replace" в конце первой строки позаботился о DistinguishedNames, которые были отформатированы как CN = LastName \, FirstName, когда присутствовал символ \ escape.Это не отрицательно влияет на имя без него.

Результат моего $ OU: OU = ChildOU2, OU = ChildOU1, OU = ParentOU, DC = DOMAIN, DC = local

0 голосов
/ 21 августа 2014

Используя различные ответы в этой теме, я придумал следующее:

$ s = ($ s -split ", * .. =") [1]

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

$ S

0 голосов
/ 25 января 2013
$s = "CN=Hall\, Jeremy,OU=Group Container,DC=corp,DC=test,DC=local"
$s1 = ($s -split ",*..=")[1]
$s1

Это работает для меня - однако у меня есть \, оставленный в выводе имени.(Я извлекаю свойство менеджера из функции get-aduser, и оно печатает отличительное имя. Hall \, Джереми - один из примеров того, что у меня осталось.

Кто-нибудь хочет взять удар?

0 голосов
/ 03 января 2013
$s = "CN=Group Name I Want,OU=Group Container,DC=corp,DC=test,DC=local"
$s1 = ($s -split ",*..=")[1]
$s1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...