Я пытаюсь получить первый DC
, который появляется для данного выдающегося имени, как показано ниже:
CN=blah1,CN=Computers,DC=blah2,DC=blah3
Итак, на простом английском языке я хочу «заменить все строки, вплоть до 'DC =', и вернуть любое значение из DC=
и до следующего ,
.
Я пробовал решить это с помощью онлайн-калькуляторов, но как-то не получается.
. + ?, DC = (. +?), (?: DC)
Почему вы хотите извлечь эту часть строки? Какую проблему ты пытаешься решить?
У нас есть несколько доменов, и у меня есть еще один сценарий, который требует доменных имен, прежде чем я смогу выполнять запросы Get-ADComputer. С тех пор я смог разделить и объединить два последних "DC = " вместе. Спасибо
Рекомендую использовать COM-объект Путь (см. Мой ответ).
Посмотри на это:
$str = "CN=blah1,CN=Computers,DC=blah2,DC=blah3"
$str -match '^.*?(DC=.*?),'
$Matches[1] # DC=blah2
Он находит первый DC=*
, где *
- это то, что следует за =
до следующей запятой.
Вам не кажется, что -split ','
было бы намного проще?
Вопрос помечен как regex
, поэтому я предоставил решение на основе регулярных выражений @Olaf, но да, простой -split ','
тоже подойдет ... :-)
Иногда ответ в другом ;-) ((('CN=blah1,CN=Computers,DC=blah2,DC=blah3' -split ',')[-1]) -split '=')[1]
@Olaf В distinghuishedName МОЖЕТ есть запятая в любом из отдельных компонентов отличительного имени. В этом случае ему предшествует обратная косая черта, чтобы его избежать. В таком случае разделение на ,
может привести к неожиданным результатам. Нечасто знаю, но ..
Даже домен и суффикс (TLD) могут иметь запятую? ... В самом деле? ... хорошо, я не знал об этом ... спасибо, что прояснили это. ;-)
Для этого достаточно Split
, т.е .:
$s = "CN=blah1,CN=Computers,DC=blah2,DC=blah3"
$s.Split(",")[2].Split(" = ")[1]
# blah2
Не разделяйте только запятыми, так как distinghuishedName МОЖЕТ имеет запятую в любом из отдельных компонентов отличительного имени. В этом случае ему предшествует обратная косая черта, чтобы его избежать.
Я отвечаю прямо на вопрос, а не на гипотетическую ситуацию. Насколько я понимаю, примерная строка разделена запятыми: "CN=blah1,CN=Computers,DC=blah2,DC=blah3"
Woll работает только для ЭТОГО конкретного примера, но нет с "CN=blah1,DC=blah2"
Конечно, но DN, который OP привел в качестве примера, ЯВЛЯЕТСЯ просто в качестве примера. Мы не знаем, что это на самом деле, и поэтому не можем сказать, использует ли какой-либо из компонентов запятую или нет. Насколько я понимаю, только @Paxz выполняет разделение, как и должно быть
@Theo Ой, правда, тогда я предлагаю еще более простое решение: "CN=blah1,CN=Computers,DC=blah2,DC=blah3".substring(25, 5)
Ничего страшного @ Тео. GL!
Однако ему необходимо найти первый экземпляр «DC =», поскольку я буду использовать Get-ADComputer из нескольких доменов, а «DC =» может появиться дальше по строке от DistinguishedName.
@TOGEEK Не могли бы вы отменить выбор моего ответа как правильного? Так можно удалить его и оставить место для лучших ответов?
Хорошо, чтобы показать второй простой метод поиска определенных частей вашей строки. Попробуйте использовать - 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
что ты уже испробовал? Покажите, пожалуйста, свой код.