Powershell 基础版

Powershell Basic

我必须在 PowerShell 上为我的编码入门课程做一个简单的计算器 +-*/。为什么我的变量 Valeur1Valeur2 在整数验证期间没有保持原样?我的 4 个选项给出了一个随机答案并且不记得我的 2 Read-Host 个变量的初始值。



Write-Host "Microsoft Powershell Calculator "

$R = $True
$OK = $True

while ($R -eq $True) {
    do {
        $Valeur1 = [int]::TryParse((Read-Host "Entrez une premiere valeur numerique"), [ref]$OK)
        if (-not $OK) {
            Write-Host ("ERREUR ! Vous devez entrez une valeur numerique")
            $OK = $false
        }
        else{
            $OK = $true    
        }
    } while (-not $OK)

    do {
        $Valeur2 = [int]::TryParse((Read-Host "Entrez une seconde valeur numerique"), [ref]$OK)
        if (-not $OK) {
            Write-Host ("ERREUR ! Vous devez entrez une valeur numerique")
            $OK = $false
        }
        else{
            $OK = $true    
        }
    } while (-not $OK)

    $operation = Read-Host -prompt "Quelle opération voulez-vous réaliser? Choisissez entre [+, -, *, or /] "
    Switch($operation)
    {
        -
        {
            Write-Host("Le resultat de votre soustraction est :")
            $Valeur1 - $Valeur2
        }
        +
        {
            Write-Host("Le resultat de votre addition est :")
            $Valeur1 + $Valeur2
        }
        *
        {
            Write-Host("Le resultat de votre multiplication est :")
            $Valeur1 * $Valeur2
        }
        /
        {
            Write-Host("Le resultat de votre division est :")
            $Valeur1 / $Valeur2
        }
        default
        {
            Write-Host("Option Invalide")
        }
    }

    $choix = Read-Host "Desirez-vous continuer? Y/N" 
    if($choix -eq "Yes"){
        $R = $true
    }
    if($choix -eq "Y"){
        $R = $true
    }
    else{
        $R = $false
        exit
    }
}

来自Int32.TryParse(String, Int32) Documentation:

result Int32
When this method returns, contains the 32-bit signed integer value equivalent of the number contained in s, if the conversion succeeded, or zero if the conversion failed.

当您执行 [ref]$OK 时,如果转换成功,此变量将保存 parsed 您的 .TryParse 操作,但是,您将在 ifelse 条件($OK = $true $OK = $false)上覆盖此值。

此外,.TryParse 方法的输出将是 $true / $false,具体取决于操作是否成功(此布尔值将分配给 $valeur1$valeur2 因为两个变量都赋值了这个操作)。

Returns Boolean
true if s was converted successfully; otherwise, false.

这是您的代码的一个简化的工作变体。值得一提的是,由于您正在执行 2 个解析操作,因此持有相同逻辑的 function (ParseInput) 会更有意义,这样代码就不会重复。

Write-Host "Microsoft Powershell Calculator V3"

function ParseInput {
    $ref = ''
    do {
        $parsed = [int]::TryParse((Read-Host "Entrez une premiere valeur numerique"), [ref]$ref)
        if (-not $parsed) {
            Write-Host "ERREUR ! Vous devez entrez une valeur numerique"
        }
    } while (-not $parsed)
    $ref
}

$R = $true

while ($R) {
    $Valeur1 = ParseInput
    $Valeur2 = ParseInput
    $operation = Read-Host "Quelle opération voulez-vous réaliser? Choisissez entre [+, -, *, or /] "
    Switch($operation) {
        - {
            Write-Host "Le resultat de votre soustraction est :"
            $Valeur1 - $Valeur2
        }
        + {
            Write-Host "Le resultat de votre addition est :"
            $Valeur1 + $Valeur2
        }
        * {
            Write-Host "Le resultat de votre multiplication est :"
            $Valeur1 * $Valeur2
        }
        / {
            Write-Host "Le resultat de votre division est :"
            $Valeur1 / $Valeur2
        }
        default {
            Write-Host "Option Invalide"
        }
    }
    $choix = Read-Host "Desirez-vous continuer? Y/N"
    if($choix -notmatch "^(Yes|Y)$") {
        $R = $false
    }
}