web-dev-qa-db-ja.com

PowerShellの整数が数字で比較されるのはなぜですか?

私のコードは、推測した数値がランダムに生成された数値より高いか低いかを示しますが、それらの1つが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の場合、"Too High"が返されます。

14
nick

これは、文字列を整数と比較しているためです。順序は重要です。

"56" -lt 7

実際には次と同じです:

"56" -lt "7"

または:

56 -lt "7"

正しい結果が得られます。 PowerShellは、右側の引数を左側の型に強制変換しようとします。

あなたは明示的なキャストを試すかもしれません:

[int]$Input -lt $GeneratedNum
21
briantist

問題は、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比較演算子を使用すると、左側のパーツのタイプが選択されて使用されるため、右側のパーツが左側のタイプにキャストされることを理解する必要があります。比較の左側に整数である$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)
4
JPBlanc

自動変数と同じ名前の変数は使用しないでください。$inputは自動変数です。

Hostから読み取った値をパイプ処理する(そして$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)のようにwrong入力(数値以外の文字)を正しく処理することに注意してください。これにより、他の提案は失敗します。

私はあなたが整数alwaysより大きい整数を生成するという事実を利用します。

0
cherimpe

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)
0
cherimpe