Share via


Understanding Booleans in PowerShell

PowerShell supports a data type Boolean, with two values possible $true, and $false. In general, $false evaluates to 0 (zero), and $true evaluates to 1. And (usually) any non-zero integer evaluates as $true. But PowerShell does automatic data type-casting, based on the left side of the equation, leading to some interesting (and correct) behaviour.
 
So consider:
PS> 0 -eq $false     #As expected
True

PS> -not 0              # As expected
True

PS> 1 -eq $true     #Still as expected
True

PS> -not 1             # OK, I guess
False

PS> $true -eq 2     # OK, that makes sense, since 2 is not zero.
True

PS> 2 -eq $true     # Hunh?
False
So, if $true is equal to 2, why isn’t 2 equal to $true? Because the method that PowerShell uses to evaluate an expression is determined by the left-most object, and this causes the right side of the equation to be cast to a the type of the leftmost object. So, in the expression $true -eq 2, what’s really happening is:
PS> [Bool]$true -eq [Bool]2
True

But when we switch sides of the expression, what we have is:
PS> [int]2 -eq [int]$true
False

And, sure enough, if we look at the integer value of $true, it’s 1 (one).
PS> [int]$true
1

This implicit casting happens all the time in PowerShell and (usually) helps make PowerShell behave the way you meant it to. But it can catch you off-guard if you’re not careful.

See Also