'Powershell: Use variable from inner loop as condition of outer loop
we're using a PS-Script for creating new AD-users and configure everything in one go. I'd like to create a unique 6-digit number and check if it's already in use. I thought a do-until-loop will do the trick, but i can't get it to re-run if a match is found.
My code as of now is this:
$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" is for testing, as it is one already used. The loop should then run endlessly, but stops after one run nevertheless, so I added some Write-Outputs to narrow it down. They show:
$PinIsUnique(IF): False
$PinIsUnique(inDO): False
$PinIsUnique(outDO): True
$TempPin: 333860
What puzzles me here: $PinIsUnique is only set at the beginning of the do-loop, before that it doesn't even exist. $PinIsUnique is False until end of the do-loop, but True when used for checking the while-condition?
I wasted by far too much time on this already: Reading up on loops in general, nested loops, global variables, return, Write-Host vs Write-Output and other things that sounded as they could help me solve this...
I altered the code for easier testing as nearly half of all options should trigger at least one re-run:
$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
As i realized just now while trying the altered code, $TempPin is useable outside the do-loop just fine... So what am I missing here?
Some litte extra if someone cares: I tried to stop the inner foreach-loop if an existing pin was found, but couldn't get that to work either. Neither break nor a labeled break worked... at least the way i tried.
Also, as i'm no expert in scripting/programming but can usually identify a well-written piece of code: How would you guys have solved this?
Thanks in advance!
Solution 1:[1]
Sometimes you just have to talk about a problem to get to the solution... and to be ashamed of yourself...
Just edited
until ($PinIsUnique="True")
to
until ($PinIsUnique -eq "True")
and it works just fine...
Other examples of how to solve it are encouraged, while i'm standing in the corner facing the wall...
Sources
This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.
Source: Stack Overflow
| Solution | Source |
|---|---|
| Solution 1 | SheiraWaansynn |
