Начнем с вопроса номера.У вас есть проверка, чтобы увидеть, существует ли уже созданный идентификатор, но когда это происходит, вы увеличиваете единицу на 1, а затем заново генерируете идентификатор, однако вы не выполняете эту же проверку еще раз, чтобы увидеть,новый идентификатор также существует.
Вместо этого вы хотите выполнить этот процесс сравнения / увеличения в цикле, который нарушает условие, что сгенерированный пользователь не существует.
Краткое примечание по сравнению $exIDArray | foreach { if ($skyID -in $_) {} }
: нет необходимости перебирать $exIDArray
, потому что оператор -in
делает это за вас, поэтому вы можете просто сделать if ($skyID -in $exIDArray) {}
, что я и делаюЯ буду использовать в этом примере цикла итерации:
$numID = "00"
$increment = 0
do {
$increment++
$skyID = $lnFive + $fnThree + $numID + $increment
} while ($skyID -in $exIDArray)
Это заменит все в вашем исходном коде с $numID = "00"
до Write-Output
.
Так что сНемедленный вопрос, я хочу обратить внимание на несколько других вещей.Например, в написанном коде (включая мой пример) будут учитываться только идентификаторы пользователей от 001
до 009
, после чего вы получите 0010
, что, вероятно, не было предназначено.
Чтобы помочь с этим, $increment
должен использоваться сам по себе, а затем дополняться нулями, где это необходимо. Это можно сделать с помощью строки формата и оператора -f
в PowerShell .
$increment = 0
do {
$increment++
$skyID = '{0}{1}{2:d3}' -f $lnFive,$fnThree,$increment
} while ($skyID -in $exIDArray)
Что касается заполнения строк имени и фамилии, эта часть:
do {
$lnFive += "_";
$l++;
} while ($l -lt 5)
Строки имеют удобные методы заполнения:
$lnFive = $lastFive.PadRight(5,'_')
$fnThree = $firstThree.PadRight(3,'_')
Число - это длина total , которую вы хотите, а затем она выясняет, сколько символов (еслилюбое) добавить.
Объединяя все вышеперечисленные элементы, давайте посмотрим, как может выглядеть модифицированный скрипт:
$exIDArray = @(
"DOE__JO_000",
"DOE_JO_001",
"SMITHNAN000",
"ZAHN_THO000"
)
$lastFive = "Doe"
$firstThree = "Jo"
$lnFive = $lastFive.ToUpper().PadRight(5,'_')
$fnThree = $firstThree.ToUpper().PadRight(3,'_')
$increment = 0;
do {
$increment++
$skyID = '{0}{1}{2:d3}' -f $lnFive,$fnThree,$increment
} while ($skyID -in $exIDArray)
Write-Output $skyID