对于数组中的每个匹配,加1

时间:2019-02-27 15:43:09

标签: arrays powershell contains

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

如果此人的姓名标准中名字少于3个字符和/或姓氏少于5个字符,我将添加一个“ _”直到满足该条件。

现在我可以找到匹配项并创建命名条件,但是如果有多个匹配项,则在有多个匹配项的情况下只会递增一次。

我需要检查分配给用户的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

1 个答案:

答案 0 :(得分:3)

让我们从数字问题开始。您已经检查过生成的ID是否已经存在,但是当它存在时,您将增加1,一次,然后重新生成ID,但是您不会再次执行相同的检查来查看是否已生成ID。新的ID也存在。

相反,您希望在不生成用户的情况下中断的循环中执行此比较/增量过程。

关于您的比较$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之间的userID,之后您将得到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