This blog作者:Jeffrey Snover提供了一些关于布尔运算符在Powershell中的行为的见解。下面是摘录,他在那里创建了一个简单的功能“测试”,以返回true或false取决于输入参数:
PS> test "0"
TRUE
PS> test 0
FALSE
PS> test 1
TRUE
PS> test 0.0
FALSE
PS> test 0x0
FALSE
PS> test 0mb
FALSE
PS> test 0kb
FALSE
PS> test 0D
FALSE
PS> test 0.00000001
TRUE
“0”是正确的,因为它是一个字符串,它的长度为1. 0是 FALSE,因为它是一个数字,该数字是0.在PowerShell中,任何计算为0的 数字都是FALSE,每个非零数字是 TRUE。该示例显示了一个浮点数零,一个十六进制数 零,0兆,0千位,0十进制,有各种各样的零,但是对于 PowerShell,它们都计算为FALSE。
没有任何示例代码,很难说发生了什么,但我们可以说的是,您的输入不被Powershell识别为零。也许这是一个字符串?如果您使用Read-Host
来获取用户输入,这将是真实的。这里有一个例子:
PS C:\> $test = Read-Host "Input"
Input: 0
PS C:\> $test.GetType()
IsPublic IsSerial Name BaseType
-------- -------- ---- --------
True True String System.Object
PS C:\> test $test
TRUE
PS C:\> $test = [Int32]$test
PS C:\> test $test
FALSE
您可以对有问题的变量使用GetType()
和修复可能的明确铸造所需的类型一件简单的事情检查。
我越读越你的问题 - 除非我误解了它 - 这似乎解决了你的问题。特别是当你评论你已经“传递各种不同的东西”时,任何非零长度的字符串将在这种情况下评估为真。
PS C:\> $anotherTest = "42"
PS C:\> test $anotherTest
TRUE
PS C:\> $anotherTest = [Int32]$anotherTest
PS C:\> test $anotherTest
TRUE
编辑:好吧,我现在,我有一些想法你的环境是什么样的工作多一点的问题。首先,我上面告诉你的一切都是真实的,所以请不要忽视它。您遇到的问题是布尔类型转换正在以不明显的方式处理PowerShell必备提示输入。
所以有些情况存在,其中的代码片段:
param
(
[Parameter(mandatory=$true)][bool]$myBool
)
Write-Host $myBool
将导致以下结果,当您使用PowerShell的强制性参数提示,而不是提交在命令行中的变量:
PS C:\> .\script.ps1
cmdlet script.ps1 at command pipeline position 1
Supply values for the following parameters:
myBool: 0
True
设我重新迭代:在PowerShell中,所有非空长度的字符串评估为true。这包括“0”,这包括字符串文字。但是问题是什么?我们已经明确声明我们的变量为bool
,所以它应该明白我的意思是0,对吧?
错误。当我们将输入设置为提示时,会出现一个相当不幸的情况,那就是我们期待bool或至少一个字符串。我们确实最终摆脱了bool,但记住当我们将它们转换为bools时非空字符串会发生什么?将类型转换为bool将应用于在提示中设置的文字输入,该输入不是数字类型。由于输入的长度非空,因此布尔转换的计算结果为true。你基本上是执行此操作:
PS C:\> [bool]$myBool = [bool]"0"
PS C:\> $myBool
True
这个最大的问题是,既然我们已经转换我们的变量为布尔,字符串已经被消耗掉,我们只是留下了值1,或真正。所以你的“0”字面上变成1.我们不能再回到0了。我们应该做什么?我将列出几个选项:
- 将您的变量设置为
[int]
类型而不是[bool]
。 bool转换消耗了“0”字符串并将其转换为1,那么为什么不使用将不会这样做的类型呢? Powershell将数字0和1理解为true和false,因此您可以使用任何数字类型。
实施例与输出:
param
(
[Parameter(mandatory=$true)][int]$myBool
)
Write-Host $myBool
PS C:\> .\script1.ps1
cmdlet script1.ps1 at command pipeline position 1
Supply values for the following parameters:
myBool: 0
0
- 如果使用的布尔变量作为逻辑开关,考虑
[switch]
参数类型来代替。除非您明确设置开关,否则开关始终为false。你不应该以这种方式暴露提示,所以你不会遇到这个问题。更多信息here。
请发布显示此行为的源 – Eris
它并不真正与我的源代码有关,因为我所做的只是将它们作为强制参数传递给它们。 其模拟脚本的其余部分发生了什么。 – Hazz22
希望你现在可以看到发布你的代码的好处。这样做似乎并不直接相关,但它为我们提供了重要的上下文,能够重现您的问题并尽快为您提供帮助。 :) –