Вы можете сделать следующее:
Function Get-SamAccountName {
Param(
[Parameter(Position=0,ValueFromPipelineByPropertyName)]
$Unit,
[Parameter(Position=1,ValueFromPipelineByPropertyName)]
$First,
[Parameter(Position=2,ValueFromPipelineByPropertyName)]
$Last
)
$fcount = 1
$lcount = 1
$inc = 1
$Sam = "{0}{1}{2}" -f $unit,$first.substring(0,$fcount).ToLower(),$last.substring(0,$lcount++).ToLower()
while (Get-AdUser -Filter "SamAccountName -eq '$Sam'") {
if ($fcount -le 2) {
$Sam = "{0}{1}{2}" -f $unit,$first.substring(0,$fcount++).ToLower(),$last.substring(0,$lcount).ToLower()
} else {
$Sam = "{0}{1}{2}{3}" -f $unit,$first.substring(0,2).ToLower(),$last.substring(0,2).ToLower(),$inc++
}
}
$Sam
}
Вариант использования 1: использование именованных параметров
Get-SamAccountName -Unit 'FLN' -First 'Sam' -Last 'Wise'
Использование Вариант 2: Использование позиционных параметров (без имени)
Get-SamAccountName 'FLN' 'Sam' 'Wise'
Использование Вариант 3: Текстовый список единиц и имен
$users = Get-Content users.txt
$users
FLN,Sam,Wise
HRS,John,Doe
COM,Jane,Doe
$users | ConvertFrom-Csv -Header 'Unit','First','Last' | Foreach {
$_ | Get-SamAccountName
}
Канал до ConvertFrom-Csv
можно пропустить здесь, если ваш файл уже является CSV с правильными заголовками.
Объяснение:
Функция возвращает Строка, представляющая доступное значение SamAccountName
.
$fcount
- это число символов имени первого имени, которое мы хотим получить. $lcount
- это число символов фамилии, которое мы хотим получить. $inc
- это число, которое мы хотим добавить к имени пользователя, если необходимо.
$var++
нотация увеличивает значение $var
на единицу после его строка казнены. Синхронизация $fcount++
и $lcount++
позволяет нам извлекать (1,1), (1,2), (2,2) символов из (первого, последнего) при минимизации кода. $inc++
будет увеличиваться после получения текущего $inc
значения.
-f
- строка оператор форматирования .
while
l oop будет выполняться только в том случае, если будет найдено текущее созданное значение SamAccountName
.
Примечание: Сложность сокращения кода может или не может стоить этого. С точки зрения производительности он не сильно выигрывает, но я чувствую, что сложность кода на этом уровне просто относительная.