Изменить 3 символа в списке пользователей DisplayName

Я пытаюсь изменить 3 символа для списка пользователей. все эти пользователи немного добавили к своему DisplayName (ABcD-что-то), я хочу изменить это что-то на (ABcD-ICC), которое я собирался использовать

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

Но единственное, что я бы изменил, это ICC в самом конце. есть ли более простой способ сделать это?


person BPengu    schedule 10.03.2020    source источник
comment
покажите пример текущего имени и ожидаемого, пожалуйста.   -  person Vad    schedule 10.03.2020
comment
Посмотрите, как разбить строку stackoverflow.com /вопросы/30617758/   -  person AutomatedOrder    schedule 10.03.2020
comment
Таким образом, текущее имя может быть: фамилия, имя (ABcD-EFG) Я хочу сделать его фамилией, именем (ABcD-HIJ)   -  person BPengu    schedule 10.03.2020


Ответы (1)


Вы можете использовать для этого оператор -replace и изменить его по мере необходимости:

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

Пояснение:

-replace использует сопоставление регулярных выражений и заменяет совпадение строкой замены. Строка замены может быть строкой литерала, содержать переменные или группы захвата, соответствующие части регулярного выражения.

. — любой одиночный символ. {3} совпадает ровно три раза. (?=) — это положительное опережающее утверждение, означающее, что будущие символы совпадают с тем, что находится внутри от текущей позиции. Упреждающий просмотр допускает совпадение, которое не захвачено, поэтому оно не выводится и не заменяется. $ означает конец строки. \) - это обратная косая черта, ускользающая от буквального ). Поскольку ( и ) имеют особое значение в регулярном выражении, их необходимо экранировать.


Иногда вы можете не знать последний символ. В этом случае вы можете использовать следующее, чтобы заменить три символа перед окончательными произвольными символами:

$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}
person AdminOfThings    schedule 10.03.2020