Hi guys, I have some spare time today so thought I would spend it on getting better at PS.
I am doing this challenge but I am a little confused with the output of a do/until.
My code.
$Minimum = 1
$Maximum = 100
Do{
$Target = Read-Host "Please enter a number between $Minimum - $Maximum"
}
Until ($Target -gt "0" -and $Target -lt "101")
I was expecting this to allow any number between 1-100., however, I am only allowed ‘100’ everything else continues in the Do loop.
Can someone explain why this happens? I assume it is to do with the -and operator…
I’m fairly sure that I could do this another way, but I would like to work out why it’s behaving in this way.
I think Powershell is smart enough to interpret $target as an int even though this wasn’t explicitly declared [int]$target.
So the loop should continue until it is true? So if you enter any integer outside the range you keep looping?
Your right and that fixed my problem, but, I still don’t get why 100 worked. Shouldn’t it fail as well due to the same problem, comparing a string to an integer?
not sure if I am just being dense, but so is ‘99’ but that fails.
Oh wait, I think I get you. Your right, because 1 works as well, i just hadn’t tested it.
Do{
[int]$Target = Read-Host “Please enter a number between $Minimum - $Maximum”
}
Until ($Target -gt “0” -and $Target -lt “101”)
Please enter a number between 1 - 100: 99
Awesome. Obviously, my issue was not declaring the [int] (Thanks @Andrew). But now I understand the behaviour I was getting where it was comparing each number in 101 individually (thanks @js).
This is what I came up with, is there anything I could have done better?
$Minimum = 1
$Maximum = 100
Do{
Write-Output "Invalid Number Selected"
#Must be read as a integer so that -lt and -gt work as expected, otherwise it compairs string to integer
[int]$Target = Read-Host "Please enter a number between $Minimum - $Maximum"
}
Until ($Target -gt "0" -and $Target -lt "101")
# Computer tries to guess number
$Guess = get-random -Maximum $Maximum -Minimum $Minimum
Write-Output "My Guess is $Guess"
DO {
# User says Higher/Lower
$Direction = Read-Host "Please Type 'H' for Higher, 'L' for Lower."
If ($Direction -eq "L"){
Write-Output "I will guess a lower value than $Guess."
$Maximum = $Guess
$Maximum--
}
ElseIf ($Direction -eq "H"){
Write-Output "I will guess a higher value than $Guess."
$Minimum = $Guess
$Minimum++
}
Else {
Write-Output "You have not selected a valid value."
}
$Guess = get-random -Maximum $Maximum -Minimum $Minimum
Write-Output "My new guess is $Guess"
}
Until ($Guess -eq $Target)
$Guess
Write-Output "I guessed right! 'nWinner, Winner, Chicken Dinner!!"
In this section of code:
If ($Direction -eq “L”){
Write-Output “I will guess a lower value than $Guess.”
$Maximum = $Guess
$Maximum–
}
ElseIf ($Direction -eq “H”){
Write-Output “I will guess a higher value than $Guess.”
$Minimum = $Guess
$Minimum++
if you increment the min or max, don’t that crash your code if you are one off?