【问题标题】:For Each Match in Array Increment by One对于数组中的每个匹配,递增一
【发布时间】:2019-07-21 09:30:20
【问题描述】:

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

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

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

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

【问题讨论】:

  • John Smith 不是johsmith001 而不是johnsmith001
  • 是的,简单的错字,与我的问题无关。
  • 您能否更新帖子以使代码反映问题(反之亦然)?问题描述了一种命名方案,代码实现相反
  • 抱歉,发帖前应该已经阅读了所有内容。

标签: arrays powershell contains


【解决方案1】:

让我们从数字问题开始。您可以检查生成的 ID 是否已经存在,但是当它存在时,您会增加 1,一次,然后重新生成 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 的用户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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-10-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多