Изменить 3 символа в списке пользователей DisplayName - PullRequest
0 голосов
/ 10 марта 2020

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

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

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

1 Ответ

0 голосов
/ 10 марта 2020

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

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

Объяснение:

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

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


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

$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}
...