Регулярное выражение Powershell для получения DC из отличительного имени

Я пытаюсь получить первый DC, который появляется для данного выдающегося имени, как показано ниже:

CN=blah1,CN=Computers,DC=blah2,DC=blah3

Итак, на простом английском языке я хочу «заменить все строки, вплоть до 'DC =', и вернуть любое значение из DC= и до следующего ,.

Я пробовал решить это с помощью онлайн-калькуляторов, но как-то не получается.

что ты уже испробовал? Покажите, пожалуйста, свой код.

Olaf 17.12.2018 15:49

. + ?, DC = (. +?), (?: DC)

TOGEEK 17.12.2018 16:23

Почему вы хотите извлечь эту часть строки? Какую проблему ты пытаешься решить?

Bill_Stewart 17.12.2018 22:26

У нас есть несколько доменов, и у меня есть еще один сценарий, который требует доменных имен, прежде чем я смогу выполнять запросы Get-ADComputer. С тех пор я смог разделить и объединить два последних "DC = " вместе. Спасибо

TOGEEK 19.12.2018 10:46

Рекомендую использовать COM-объект Путь (см. Мой ответ).

Bill_Stewart 19.12.2018 16:54
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
5
1 058
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Посмотри на это:

$str = "CN=blah1,CN=Computers,DC=blah2,DC=blah3"
$str -match '^.*?(DC=.*?),'
$Matches[1] # DC=blah2 

Он находит первый DC=*, где * - это то, что следует за = до следующей запятой.

Вам не кажется, что -split ',' было бы намного проще?

Olaf 17.12.2018 15:53

Вопрос помечен как regex, поэтому я предоставил решение на основе регулярных выражений @Olaf, но да, простой -split ',' тоже подойдет ... :-)

TobyU 17.12.2018 15:55

Иногда ответ в другом ;-) ((('CN=blah1,CN=Computers,DC=blah2,DC=blah3' -split ',')[-1]) -split '=')[1]

Olaf 17.12.2018 15:59

@Olaf В distinghuishedName МОЖЕТ есть запятая в любом из отдельных компонентов отличительного имени. В этом случае ему предшествует обратная косая черта, чтобы его избежать. В таком случае разделение на , может привести к неожиданным результатам. Нечасто знаю, но ..

Theo 17.12.2018 16:02

Даже домен и суффикс (TLD) могут иметь запятую? ... В самом деле? ... хорошо, я не знал об этом ... спасибо, что прояснили это. ;-)

Olaf 17.12.2018 16:05
Ответ принят как подходящий

Для этого достаточно Split, т.е .:

$s = "CN=blah1,CN=Computers,DC=blah2,DC=blah3"
$s.Split(",")[2].Split(" = ")[1]
# blah2

Демо Powershell

Не разделяйте только запятыми, так как distinghuishedName МОЖЕТ имеет запятую в любом из отдельных компонентов отличительного имени. В этом случае ему предшествует обратная косая черта, чтобы его избежать.

Theo 17.12.2018 16:05

Я отвечаю прямо на вопрос, а не на гипотетическую ситуацию. Насколько я понимаю, примерная строка разделена запятыми: "CN=blah1,CN=Computers,DC=blah2,DC=blah3"

Pedro Lobito 17.12.2018 16:08

Woll работает только для ЭТОГО конкретного примера, но нет с "CN=blah1,DC=blah2"

marsze 17.12.2018 16:13

Конечно, но DN, который OP привел в качестве примера, ЯВЛЯЕТСЯ просто в качестве примера. Мы не знаем, что это на самом деле, и поэтому не можем сказать, использует ли какой-либо из компонентов запятую или нет. Насколько я понимаю, только @Paxz выполняет разделение, как и должно быть

Theo 17.12.2018 16:13

@Theo Ой, правда, тогда я предлагаю еще более простое решение: "CN=blah1,CN=Computers,DC=blah2,DC=blah3".substring(25, 5)

marsze 17.12.2018 16:18

Ничего страшного @ Тео. GL!

Pedro Lobito 17.12.2018 16:19

Однако ему необходимо найти первый экземпляр «DC =», поскольку я буду использовать Get-ADComputer из нескольких доменов, а «DC =» может появиться дальше по строке от DistinguishedName.

TOGEEK 17.12.2018 16:22

@TOGEEK Не могли бы вы отменить выбор моего ответа как правильного? Так можно удалить его и оставить место для лучших ответов?

Pedro Lobito 17.12.2018 16:30

Хорошо, чтобы показать второй простой метод поиска определенных частей вашей строки. Попробуйте использовать - split:

$string = "CN=blah1,CN=Computers,DC=blah2,DC=blah3"

#Seperate the string at ",DC = " and get the second part
($string -split ',DC=')[1]

Возвращает: blah2

Я думаю, что лучший (под «лучшим» я имею в виду «самый надежный») ответ - не выполнять синтаксический анализ строк или регулярное выражение в первую очередь, а использовать IADSPathname интерфейс для получения части имени, которая вас интересует. Это доступный (хотя изначально несколько сложный) в PowerShell через COM-объект Путь. Объект Путь автоматически обрабатывает все экранирование символов.

Пример:

$ADS_SETTYPE_DN = 4
$ADS_DISPLAY_VALUE_ONLY = 2

$Pathname = New-Object -ComObject Pathname

$distinguishedName = "CN=blah1,CN=Computers,DC=blah2,DC=blah3"

# Set the AD path in the object
$Pathname.GetType().InvokeMember("Set", "InvokeMethod", $null, $Pathname, @($distinguishedName,$ADS_SETTYPE_DN))

# Get the number of name elements
$numElements = $Pathname.GetType().InvokeMember("GetNumElements", "InvokeMethod", $null, $Pathname, $null)

# Retrieve the second-to-last name element (outputs "DC=blah2")
$Pathname.GetType().InvokeMember("GetElement", "InvokeMethod", $null, $Pathname, $numElements - 2)

# Set the display type to values only
$Pathname.GetType().InvokeMember("SetDisplayType", "InvokeMethod", $null, $Pathname, $ADS_DISPLAY_VALUE_ONLY)

# Retrieve the second-to-last name element (outputs "blah2")
$Pathname.GetType().InvokeMember("GetElement", "InvokeMethod", $null, $Pathname, $numElements - 2)

По общему признанию, COM-объект Путь нелегко использовать в PowerShell, потому что вы должны вызывать его косвенно. Это можно несколько смягчить, используя функцию-оболочку для вызова методов объекта. Пример:

$ADS_SETTYPE_DN = 4
$ADS_DISPLAY_VALUE_ONLY = 2

$Pathname = New-Object -ComObject Pathname

function Invoke-Method {
  param(
    [__ComObject] $object,
    [String] $method,
    $parameters
  )
  $output = $object.GetType().InvokeMember($method, "InvokeMethod", $null, $object, $parameters)
  if ( $output ) { $output }
}

$distinguishedName = "CN=blah1,CN=Computers,DC=blah2,DC=blah3"

# Set the AD path in the object
Invoke-Method $Pathname "Set" @($distinguishedName,$ADS_SETTYPE_DN)

# Get the number of name elements
$numElements = Invoke-Method $Pathname "GetNumElements"

# Retrieve the second-to-last name element (outputs "DC=blah2")
Invoke-Method $Pathname "GetElement" ($numElements - 2)

# Set the display type to values only
Invoke-Method $Pathname "SetDisplayType" $ADS_DISPLAY_VALUE_ONLY

# Retrieve the second-to-last name element (outputs "blah2")
Invoke-Method $Pathname "GetElement" ($numElements - 2)

Для полного решения я написал модуль PowerShell под названием ADName, который предоставляет простой в использовании интерфейс для объектов Путь и ИмяПеревести.

В модуле ADName командлет Get-ADName является оболочкой для объекта Путь, а командлет Convert-ADName является оболочкой для объекта ИмяПеревести. Пример:

# Get elements of name as an array
$nameElements = Get-ADName "CN=blah1,CN=Computers,DC=blah2,DC=blah3" -Split
# Output second-to-last element (e.g., "DC=blah2")
$nameElements[-2]

# Get name elements (values only)
$nameElements = Get-ADName "CN=blah1,CN=Computers,DC=blah2,DC=blah3" -Split -ValuesOnly
# Output second-to-last element (e.g., "blah2")
$nameElements[-2]

Я обнаружил, что командлеты Get-ADName и Convert-ADName чрезвычайно полезны в различных сценариях. Один пример:

$name = "CN=blah1,CN=Computers,DC=blah2,DC=blah3"
# Output canonical name of parent path; e.g.: "blah2.blah3/Computers"
$name | Get-ADName -Format Parent | Convert-ADName Canonical

Другие вопросы по теме