对于数组中的每个匹配项递增 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
的所有内容。
因此,为了解决眼前的问题,我想提醒大家注意其他几件事。首先,编写的代码(包括我的示例)将只允许从 001
到 009
的用户 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
我正在通过获取姓氏的前五个字符和名字的前三个字符,然后在该字符串的末尾添加 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
的所有内容。
因此,为了解决眼前的问题,我想提醒大家注意其他几件事。首先,编写的代码(包括我的示例)将只允许从 001
到 009
的用户 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