我正在通过分配姓氏的前五个字符,姓氏的前三个字符,然后在该字符串的末尾添加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
答案 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
的原始代码中的所有内容。
因此,在没有直接问题的情况下,我想引起其他注意。一方面,编写的代码(包括我的示例)仅允许使用001
到009
之间的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