对于数组中的每个匹配项递增 1

For Each Match in Array Increment by One

我正在通过获取姓氏的前五个字符和名字的前三个字符,然后在该字符串的末尾添加 001 来分配用户 ID。因此,名为 Jo Doe 的人将被分配 "DOE__JO_000" 作为他的用户 ID。

如果此人的名字标准是名字少于三个字符 and/or 姓氏少于五个字符,我会添加一个“_”直到满足该标准。

现在我可以找到匹配项并创建命名标准,但如果有多个匹配项,它只会在有多个匹配项时递增一次。

我需要检查分配给用户的 ID 是否已存在于项目中,如果存在则将新 ID 递增 1?

例如,如果项目中有一个名为Jo Doe的用户已经分配了ID "DOE__JO_000",那么我想给另一个Jo Doe加1,给他ID "DOE__JO_001"。但是,如果有第三个 Jo Doe,那么它将增加到 "DOE__JO_002"。

这是我的代码:

$exIDArray = @("DOE__JO_000","DOE_JO_001","SMITHNAN000","ZAHN_THO000")

$lastFive = "Doe";
$lnFive = $lastFive.toUpper()

$l = $lastFive.length

do {

$lnFive += "_";
$l++;

} while ($l -lt 5)

$firstThree = "Jo";
$fnTHree = $firstThree.toUpper()

$f = $firstThree.length

do {

$fnThree += "_";
$f++;

} while ($f -lt 3)

$numID = "00"
$increment = 0;

$skyID = $lnFive + $fnThree + $numID + $increment

$exIDArray | foreach {
 if ($skyID -in $_)
{
$increment++;
}
}

$skyID = $lnFive + $fnThree + $numID + $increment

Write-Output $skyID

让我们从数字问题开始。您已经检查生成的 ID 是否已经存在,但是当它存在时,您每次递增 1,然后重新生成 ID,但是您没有再次进行相同的检查以查看是否新 ID 也存在。

相反,您想在一个循环中执行该 compare/increment 过程,该循环会在生成的用户不存在的情况下中断。

关于您的比较的快速说明 $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 的所有内容。


因此,为了解决眼前的问题,我想提醒大家注意其他几件事。首先,编写的代码(包括我的示例)将只允许从 001009 的用户 ID,之后您将得到 0010,这可能不是预期的。

为了解决这个问题,$increment 应该单独使用,然后在适当的地方用零填充。 That can be done with a format string, and the -f operator in 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,'_')

这个数字是你想要的长度,然后它会计算出要添加多少个字符(如果有的话)。


结合以上所有元素,让我们看看修改后的脚本可能是什么样子:

$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