December 24th, 2006

Boolean Values and Operators

PowerShell Team
PowerShell Team

John Smith asked what TRUE and FALSE were in PowerShell on our newsgroup Microsoft.Public.Windows.PowerShell.   The simple answer to this is $TRUE and $FALSE but the complete answer is a richer.  PowerShell has a very rich notion of TRUE and FALSE.  The best way to explain it is to show it. 

PS>  function test ($VALUE) {
>> if ($VALUE) {
>>     Write-Host -ForegroundColor GREEN “TRUE”
>> } else {
>>     Write-Host -ForegroundColor RED   “FALSE”
>> }
>> }
>>
PS> test $TRUE
TRUE
PS> test $FALSE
FALSE
PS> test TRUE
TRUE
PS> test FALSE
TRUE

The question a lot of PowerShell newbies ask is:  ‘Why is “FALSE” TRUE?”   In PowerShell, Strings can be evaluated as Booleans.  If a string is ZERO length – it is false, otherwise it is TRUE.  “FALSE” has 5 characters so it is TRUE.

PS> test “SHORT STRING”
TRUE
PS> test “”
FALSE
PS> $x=(”                    ” -replace ” “)
PS> test $x
FALSE
PS>

Given that see if you can figure out what is going on with the sequence below:

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
PS>

“0” is TRUE because it is a STRING and it has a length of 1.  0 is FALSE because it is a number and that number is 0.  In PowerShell, any number which evaluates to 0 is FALSE and every non-zero number is TRUE.  The example shows you a floating point zero, a hexadecimal zero, 0 megs, 0 kilos, 0 decimal, there are all sorts of zeros but to PowerShell, they all evaluate to FALSE. 

The next one should be a little easier to figure out.  The last 2 lines shows you what you would have to type if we didn’t have a rich concept of TRUE and FALSE.

PS> $x=@(1,2,3,4,5)
PS> test $x
TRUE
PS> $x=@()
PS> test $x
FALSE
PS> test (get-Process)
TRUE
PS> test (get-Process |where {$_.name -eq “PowerShell”})
TRUE
PS> test (get-Process |where {$_.name -eq “NoSuchProcess”})
FALSE
PS> test (@(get-Process |where {$_.name -eq “PowerShell”}).count -ne 0)
TRUE
PS> test (@(get-Process |where {$_.name -eq “NoSuchProcess”}).count -ne 0)
FALSE

Here is your last example.  If a variable is defined, we use its value to determine TRUE/FALSE but if the variable is not defined – it is FALSE.

PS> $x=10
PS> test $x
TRUE
PS> $x=0
PS> test $x
FALSE
PS> test $NoSuchVariable
FALSE
PS> set-psdebug -strict
PS> $NoSuchVariable
The variable $NoSuchVariable cannot be retrieved because it has not been se
t yet.
At line:1 char:15
+ $NoSuchVariable <<<<

PS>

PowerShell has a rich notion of TRUE/FALSE because it dramatically reduces the overhead and junk that you need to deal with when doing your work.

Happy Holidays!

Jeffrey Snover [MSFT]
Windows PowerShell/MMC Architect
Visit the Windows PowerShell Team blog at:    http://blogs.msdn.com/PowerShell
Visit the Windows PowerShell ScriptCenter at:  http://www.microsoft.com/technet/scriptcenter/hubs/msh.mspx

Category
PowerShell

Author

PowerShell Team
PowerShell Team

PowerShell is a task-based command-line shell and scripting language built on .NET. PowerShell helps system administrators and power-users rapidly automate tasks that manage operating systems (Linux, macOS, and Windows) and processes.

1 comment

Discussion is closed. Login to edit/delete existing comments.

  • Peter McEvoy

    But check this out:
    [master ≡]> “False” -eq $falseTrue
    and
    [master ≡]> $false -eq “False”False
    Probably cos in the first, $false is getting converted to it’s string representation, but in the second “False” is getting converted to a boolean, and non-zero length strings are $true