我有一个项目,必须将DisplayName
属性复制到extensionAttribute1
属性。
通常,我可以将DisplayName
属性复制到extensionAttribute1
属性。
Get-ADUser -LDAPFilter '(DisplayName=*)' -Properties Description, DisplayName |
Select-Object * -First 5 |
ForEach-Object {Set-ADObject -Identity $_.DistinguishedName `
-Replace @{extensionAttribute1=$($_.DisplayName)}}
但是,我需要解析方括号之间的文本,如下所示。之后,我将其复制到extensionAttribute1属性。
DisplayName attribute : John Conner (IT DEPARMANT)
答案 0 :(得分:0)
这可以通过-Split
运算符完成。
Get-ADUser -LDAPFilter '(DisplayName=*)' -Properties Description, DisplayName |
Select-Object * -First 5 | ForEach-Object {
Set-ADObject -Identity $_.DistinguishedName -Replace @{extensionAttribute1=$(($_.DisplayName -Split "\((.*?)\)")[1])}
}
在这种情况下,-Split
运算符正在使用正则表达式匹配。它通常会产生一个三索引数组。第一个元素[0]
是括号前的字符。第二个元素[1]
将是第一组括号内的字符。最后一个元素[2]
将是字符串值的其余字符,在这种情况下将为空行。如果您有多组括号,但只想捕获第一组中的字符串,则此解决方案仍然可以使用。
\(
是(
的字面匹配。(.*?)
.*?
是任何字符的贪婪匹配()
告诉-Split
将所有内容放在括号内。通常,它将删除您匹配的字符串。\)
是)
的文字匹配有关更多详细信息,请参见About Split。
答案 1 :(得分:0)
我将使用预定义的Regex对象来做到这一点,以使代码易于阅读:
# create a regex to get the part of the DisplayName between the brackets
$re = [regex] '\((.+)\)'
Get-ADUser -LDAPFilter '(DisplayName=*)' -Properties Description, DisplayName |
Select-Object * -First 5 |
ForEach-Object {
$name = $re.Match($_.DisplayName).Groups[1].Value
$_ | Set-ADObject -Replace @{extensionAttribute1=$name}
}
正则表达式详细信息:
\( Match the character “(” literally ( Match the regular expression below and capture its match into backreference number 1 . Match any single character that is not a line break character + Between one and unlimited times, as many times as possible, giving back as needed (greedy) ) \) Match the character “)” literally