【问题标题】:Change 3 characters in a list of users DisplayName更改用户列表中的 3 个字符 DisplayName
【发布时间】:2020-03-10 12:44:53
【问题描述】:

我正在尝试为用户列表更改 3 个字符。所有这些用户在他们的 DisplayName (ABcD-somthing) 上都添加了一些内容,我想将其更改为 (ABcD-ICC) 我打算用

Set-aduser -Identity $_.SamAccountName -Replace @{DisplayName="$_.Surname, $_.GivenName (ABcD-ICC)"}

但我唯一要改变的是最后的 ICC。有更简单的方法吗?

【问题讨论】:

  • 请显示当前名称和预期名称的示例。
  • 看看如何拆分字符串stackoverflow.com/questions/30617758/…
  • -Replace @{DisplayName=$_.DisplayName -replace 'ICC\)$','something)'}?
  • 所以当前的名字可能是:姓氏,名字(ABcD-EFG)我想把它变成姓氏,名字(ABcD-HIJ)

标签: powershell active-directory


【解决方案1】:

您可以为此使用-replace 运算符并根据需要进行更改:

# Replaces three characters before a final character of )
$replace = 'ICC'
Set-aduser -Identity $_.SamAccountName -Replace @{DisplayName=$_.DisplayName -replace '.{3}(?=\)$)',$replace}

说明:

-replace 使用正则表达式匹配并将匹配替换为替换字符串。替换字符串可以是文字字符串、包含变量或捕获与正则表达式部分匹配的组。

. 是任何单个字符。 {3} 恰好匹配了 3 次。 (?=) 是一个积极的前瞻断言,这意味着未来的字符与当前位置内部的字符匹配。 Lookahead 允许未捕获的匹配,因此它不输出也不替换。 $ 表示字符串的结尾。 \) 是转义文字 ) 的反斜杠。由于()在正则表达式中有特殊含义,所以必须转义。


有时您可能不知道最后一个字符。在这种情况下,您可以使用以下内容来替换最后一个任意字符之前的三个字符:

$replace = 'ICC'
Set-aduser -Identity $_.SamAccountName -Replace @{DisplayName=$_.DisplayName -replace '.{3}(?=.$)',$replace}

如果您想替换最后三个字符而不考虑它们的值,您可以执行以下操作:

$replace = 'ICC'
Set-aduser -Identity $_.SamAccountName -Replace @{DisplayName=$_.DisplayName -replace '.{3}$',$replace}

如果你想替换最后三个连续的字母字符,即使它们远离字符串的末尾,你可以这样做:

$replace = 'ICC'
Set-aduser -Identity $_.SamAccountName -Replace @{DisplayName=$_.DisplayName -replace '[a-z]{3}(?=[^a-z]*$)',$replace}

【讨论】:

    猜你喜欢
    • 2023-03-16
    • 1970-01-01
    • 2020-03-13
    • 1970-01-01
    • 2023-02-22
    • 2018-04-18
    • 1970-01-01
    • 2019-01-23
    • 1970-01-01
    相关资源
    最近更新 更多