Powershell,检查空白输入,零计算为 blank/null

Powershell, check for blank input, zero evaluates as blank/null

我正在尝试验证一个简单的 powershell 输入。我想允许数字零作为有效输入,但空白(只需按回车键)不是有效输入。我在验证方面遇到了最困难的时期。一切正常,除非用户输入数字零。 我试过检查长度,检查空值等。 考虑下面的代码。 如果您输入 0(零),则输出与您仅按 [enter](无输入)

相同
Pick a number 0-6: 0
You picked 0
blank input
equals zero
too short


$OUchoice = -1
do
{
    try{
        $OUchoice = Read-Host "Pick a number 0-6" 
    }
    catch{
        write-host "invalid input"
    }

    Write-Host "You picked $OUchoice"

    if ($OUchoice -gt 6) {write-host "too high"}
    if ($OUchoice -lt 0) {write-host "too low"}
    if ($OUchoice -eq "") {write-host "blank input"}
    if ($OUchoice -eq 0 ) {write-host "equals zero"}
    if ($OUchoice -eq $null ) {write-host "Null"}
    if (!($OUchoice)) {write-host "too short"}  
}
until (($OUchoice -ge 0) `
        -and ($OUchoice -le 6) `
        -and (($ouchoice)))

write-host "OK"

我试过 -eq $NULL 和 -eq ""。允许零输入和不允许空白输入的正确方法是什么?

这是我想到的。当您将它与其他数字进行比较时,我确保 $OUChoice 是一个 Int。这确保空输入是 0 并且还允许负值。

$OUchoice = -1
do
{
    try{
        $OUchoice = Read-Host "Pick a number 0-6" 
    }
    catch{
        write-host "invalid input"
    }

    Write-Host "You picked $OUchoice"
    Switch ($OUchoice) {
         {
            [string]::IsNullOrEmpty($OUchoice)} {
                write-host "Null Input"
                Break
        }
         {
            [int]$OUchoice -gt 6} {
                write-host "too high"
                Break
        }
         {
            [int]$OUchoice -lt 0} {
                write-host "too low"
                Break
        }
         {
            [int]$OUchoice -eq 0 } {
                write-host "equals zero"
                Break
        }         
    } 
}

    until (([int]$OUchoice -ge 0) -and ([int]$OUchoice -le 6) -AND (-NOT [string]::IsNullOrEmpty($OUchoice)))
write-host "OK"

问题出在这里:

PS> 0 -eq ""
True

当比较两个不同类型的值时,第二个参数转换为第一个参数的类型。不幸的是你:

PS> [int]""
0

转换为 int 时的空字符串会生成 0。在您的情况下,修复很简单:只需反转操作数的顺序,因为 0 转换为字符串最终会成为 '0':

if ("" -eq $OUchoice) {write-host "blank input"}

嵌套你的 ifs(我没有测试太多,但确实检查了零和空白的情况):

if (-not ($OUchoice -eq ""))
{
        if ($OUchoice -gt 6) {write-host "too high"}
        if ($OUchoice -lt 0) {write-host "too low"}
        if ($OUchoice -eq 0 ) {write-host "equals zero"}
        if ($OUchoice -eq $null ) {write-host "Null"}
        if (!($OUchoice)) {write-host "too short"}
}
else
{
    Write-Output "blank input"
}

输出:

PS C:\users\mattp_000> .\x.ps1
Pick a number 0-6:
You picked
blank input
Pick a number 0-6: 0
You picked 0
equals zero
OK
PS C:\users\mattp_000> .\x.ps1
Pick a number 0-6: 3
You picked 3
OK
PS C:\users\mattp_000>