【问题标题】:PowerShell Boolean accepts all numbersPowerShell 布尔值接受所有数字
【发布时间】:2015-02-11 22:00:46
【问题描述】:

我想我在这里遗漏了一些明显的东西。据我了解,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]10 即可复制此行为
  • 感谢马特的提醒。但我真的希望我的函数只接受$True$False01,仅此而已。我认为Boolean 类型可以做到这一点..
  • 哦,我明白了。我只是想指出您的功能可以出于测试目的而简化。真的没有帮助,但this post 说“而且(通常)任何非零整数都计算为 $true”
  • stackoverflow.com/a/18516573/3829407 链接到一篇博客文章:在 PowerShell 中,任何计算结果为 0 的数字都是 FALSE,每个非零数字都是 TRUE。你需要以不同的方式解释这一点。喜欢ValidateSet

标签: powershell boolean


【解决方案1】:

我猜[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 的答案,其中讨论了如果您确实需要测试/转换为布尔值的方法。

【讨论】:

  • 鉴于 OP 的限制,这不起作用。 Test-Bar 0Test-Bar 1 失败。
  • @Matt 我意识到,这是一种替代方法。据我所知,switch 参数正是针对这种情况而存在的
  • 在检查了您的建议和马特的文档之后,似乎确实建议只使用 Switch 参数。我只需要弄清楚将0 转换为$False1 转换为$True,然后再填充飞溅哈希表以提供函数。谢谢你们,我显然错了Booleans
猜你喜欢
  • 2014-01-06
  • 1970-01-01
  • 2017-06-26
  • 2022-06-13
  • 2012-08-21
  • 2011-10-05
  • 1970-01-01
  • 2010-09-29
  • 1970-01-01
相关资源
最近更新 更多