我的代码告诉您猜测的数字是高于还是低于随机生成的数字,但似乎只比较数字的第一个数字,当其中一个数字低于10时。
order()
例如,当[int]$GeneratedNum = Get-Random -min 1 -max 101
Write-Debug $GeneratedNum
$isQuitting = $false
Do{
[int]$Input = Read-Host "Take a guess!"
If($Input -lt $GeneratedNum){Write-Output "Too Low"}
If($Input -gt $GeneratedNum){Write-Output "Too High"}
If($Input -eq $GeneratedNum){Write-Output "Good Job!"; $isQuitting = $true}
} Until($isQuitting -eq $true)
和$GeneratedNum = 56
时,它会返回$Input = 7
答案 0 :(得分:18)
这是因为您要将字符串与整数进行比较。订单很重要。
"56" -lt 7
实际上与:
相同"56" -lt "7"
可替换地:
56 -lt "7"
会给你正确的结果。 PowerShell尝试将右侧参数强制转换为左侧类型。
您可以尝试显式演员:
[int]$Input -lt $GeneratedNum
答案 1 :(得分:4)
问题来自于Read-Host
返回一个字符串,因此您的演员$Input
是ArrayListEnumeratorSimple
尝试:
[int]$GeneratedNum = Get-Random -min 1 -max 101
Write-host $GeneratedNum
$isQuitting = $false
Do{
$Input = (Read-Host "Take a guess!") -as [int]
If($Input -lt $GeneratedNum){Write-Output "Too Low"}
If($Input -gt $GeneratedNum){Write-Output "Too High"}
If($Input -eq $GeneratedNum){Write-Output "Good Job!"; $isQuitting = $true}
} Until($isQuitting -eq $true)
您还应该使用try{}catch{}
来捕获输入不是int的情况。
您必须了解的是,当您使用PowerShell比较运算符时,左侧部分的类型将被选中,因此rigth部分将被转换为左侧类型。知道你可以写下面的内容,我只是在比较的左边放了一个整数$GeneratedNum
:
[int]$GeneratedNum = Get-Random -min 1 -max 101
Write-host $GeneratedNum
$isQuitting = $false
Do{
$Input = (Read-Host "Take a guess!")
If($GeneratedNum -gt $Input){Write-Output "Too Low"}
If($GeneratedNum -lt $Input){Write-Output "Too High"}
If($GeneratedNum -eq $Input){Write-Output "Good Job!"; $isQuitting = $true}
} Until($isQuitting -eq $true)
答案 2 :(得分:0)
永远不要使用与自动变量同名的变量:$input
是一个自动变量。
请参阅此代码,其中我管道从主机读取的值(并且不使用$input
变量):
[int]$GeneratedNum = Get-Random -min 1 -max 101
Write-Debug $GeneratedNum
$isQuitting = $false
Do{
Read-Host "Take a new guess!" | %{
if($_ -as [int] -gt 0){
If($_ -lt $GeneratedNum){Write-Output "Too Low"}
If($_ -gt $GeneratedNum){Write-Output "Too High"}
If($_ -eq $GeneratedNum){Write-Output "Good Job!"; $isQuitting = $true}
}
}
} Until($isQuitting -eq $true)
重要的是要注意我的代码正确处理错误的输入(非数字字符),如w
或类似字符串(qwerty
),这会使其他提案失败。
我利用生成始终大于0的整数的事实。
答案 3 :(得分:0)
使用switch
:
[int]$GeneratedNum = Get-Random -min 1 -max 101
Write-Debug $GeneratedNum
:lop Do{
switch ((Read-Host 'Take a new guess!') -as [int])
{
{$_ -eq $null}{continue}
{$_ -lt $GeneratedNum}{'Too Low';continue}
{$_ -gt $GeneratedNum}{'Too High';continue}
{$true}{'Good Job!';break lop}
}
} while($true)