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")
而且效果很好...
鼓励其他解决问题的例子,而我站在墙角...
我们正在使用 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")
而且效果很好...
鼓励其他解决问题的例子,而我站在墙角...