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

Why do integers in PowerShell compare by digits?

我的代码告诉你你猜的数字是高于还是低于随机生成的数字,但它似乎只比较其中一个数字低于 10 时的第一位数字。

[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时,它returns"Too High"

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

"56" -lt 7

其实是一样的:

"56" -lt "7"

或者:

56 -lt "7"

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

您可以尝试显式转换:

[int]$Input -lt $GeneratedNum

问题来自这样一个事实,即 Read-Host return 一个字符串,所以你的演员表 $Input 是一个 ArrayListEnumeratorSimple try :

[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比较运算符时,左边的类型是用selected的,所以右边的部分被强制转换成左边的类型。知道您可以编写以下内容,我只是将 $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)

切勿使用与自动变量同名的变量:$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 的事实。

使用 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)