PowerShell 布尔值接受所有数字

PowerShell Boolean accepts all numbers

我想我在这里遗漏了一些明显的东西。在我的理解中,Boolean 只能是 0$False1$True。但是当我尝试其他整数时,它们也被接受为 $True

当使用其他整数时 01 函数应该抛出一个错误,指出它不是 Boolean。还是应该通过为这 4 个不同的输入选项添加 ValidateSet 错误处理来解决这个问题?

示例:

Function Test-Bar {
    [CmdletBinding()]
    Param(
        [Parameter(Mandatory=$True,Position=0)]
        [Bool]$Var
    )
    Write-Host "Yes, you entered a valid boolean: $Var" -ForegroundColor Yellow
}

[INT]$Number = '0'
Test-Bar -Var $Number

[INT]$Number = '1'
Test-Bar -Var $Number

[INT]$Number = '10'
Test-Bar -Var $Number # Incorrect, ten is not a boolean

[INT]$Number = '22'
Test-Bar -Var $Number # Incorrect, twenty two is not a boolean

感谢您的帮助。

我猜 [bool] 类型隐式地将任何非 $null$false0 或空字符串转换为 $true

> [bool]$true
True
> [bool]'foo'
True
> [bool]$false
False
> [bool]''
False
> [bool]$null
False

我认为在你的情况下,在你的 cmdletbinding 中使用 SwitchParameter 是合适的:

Function Test-Bar {
    [CmdletBinding()]
    Param(
        [Parameter(Mandatory=$True,Position=0)]
        [Switch]$Var
    )
    Write-Host "Yes, you entered a valid boolean: $Var" -ForegroundColor Yellow
}

并像这样打电话:

> Test-Bar -var
Yes, you entered a valid boolean: True
> Test-Bar -var:$false
Yes, you entered a valid boolean: False

您可能还想查看答案 on this question,其中讨论了 test/convert 布尔值的方法(如果确实需要的话)。