将一个AD属性字段复制到另一字段

时间:2019-04-25 08:41:35

标签: powershell

我有一个项目,必须将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)

2 个答案:

答案 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