为什么PowerShell中的整数按数字比较?

时间:2015-06-30 19:36:51

标签: powershell comparison operators

我的代码告诉您猜测的数字是高于还是低于随机生成的数字,但似乎只比较数字的第一个数字,当其中一个数字低于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

4 个答案:

答案 0 :(得分:18)

这是因为您要将字符串与整数进行比较。订单很重要。

"56" -lt 7

实际上与:

相同
"56" -lt "7"

可替换地:

56 -lt "7"

会给你正确的结果。 PowerShell尝试将右侧参数强制转换为左侧类型。

您可以尝试显式演员:

[int]$Input -lt $GeneratedNum

答案 1 :(得分:4)

问题来自于Read-Host返回一个字符串,因此您的演员$InputArrayListEnumeratorSimple尝试:

[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)