Powershell:使用内循环中的变量作为外循环的条件

Powershell: Use variable from inner loop as condition of outer loop

我们正在使用 PS-Script 来创建新的 AD 用户并一次性配置所有内容。 我想创建一个唯一的 6 位数号码并检查它是否已被使用。 我认为 do-until-loop 可以解决问题,但如果找到匹配项,我无法重新运行。

我现在的代码是这样的:

    $AllUsedPins=(Get-ADUser -Properties ExtensionAttribute3 -Filter {ExtensionAttribute3 -like '*'} | select -ExpandProperty ExtensionAttribute3)
    do{
        $PinIsUnique="True"
        #$TempPin="333860"
        $TempPin=(Get-Random -Minimum 0 -Maximum 999999).ToString('000000')
        foreach ($UsedPin in $AllUsedPins) {
            If ("$TempPin" -eq "$UsedPin" ) {
                $PinIsUnique="False"
                Write-Host '$PinIsUnique(IF): '$PinIsUnique
            }
        }
    Write-Host '$PinIsUnique(inDO): '$PinIsUnique
    }
    until ($PinIsUnique="True")
    Write-Host '$PinIsUnique(outDO): '$PinIsUnique

    #Set-ADUser -Identity $sam -Replace @{extensionAttribute3=$TempPin}

$TempPin="333860" 用于测试,因为它已被使用。然后循环应该无休止地 运行,但是在一个 运行 之后停止,所以我添加了一些 Write-Outputs 来缩小范围。他们显示:

$PinIsUnique(IF):  False
$PinIsUnique(inDO):  False
$PinIsUnique(outDO):  True
$TempPin:  333860

这里让我困惑的是: $PinIsUnique 仅在 do-loop 的开头设置,在此之前它甚至不存在。 $PinIsUnique 在 do 循环结束之前为假,但在用于检查 while 条件时为真?

我已经在这上面浪费了太多时间:阅读一般循环、嵌套循环、全局变量、return、Write-Host 与 Write-Output 以及其他听起来可能的内容帮我解决这个问题...

我更改了代码以便于测试,因为将近一半的选项应该至少触发一次重新运行:

    $AllUsedPins=("01", "02", "03", "04", "05", "11", "12", "13", "14", "15")
    do{
        $PinIsUnique="True"
        $TempPin=(Get-Random -Minimum 0 -Maximum 20).ToString('00')
        foreach ($UsedPin in $AllUsedPins) {
            If ("$TempPin" -eq "$UsedPin" ) {
                $PinIsUnique="False"
            }
        }
    }
    until ($PinIsUnique="True")
    Write-Host '$AllUsedPins: '$AllUsedPins
    Write-Host '$TempPin: '$TempPin

正如我刚才在尝试修改后的代码时意识到的那样,$TempPin 在 do-loop 之外可用就好了...那么我在这里错过了什么?

如果有人关心的话,还有一些额外的东西: 如果找到现有的 pin,我试图停止内部 foreach 循环,但也无法让它工作。 break 和标记的 break 都不起作用......至少我试过的方式。

此外,由于我不是 scripting/programming 方面的专家,但通常可以识别一段编写良好的代码:你们是如何解决这个问题的?

提前致谢!

有时候你只需要谈论一个问题就可以找到解决方案......并且为自己感到羞耻......

刚刚编辑 until ($PinIsUnique="True")until ($PinIsUnique -eq "True") 而且效果很好...

鼓励其他解决问题的例子,而我站在墙角...