198

What are the Boolean literals in PowerShell?

Peter Mortensen
  • 30,738
  • 21
  • 105
  • 131
Colonel Panic
  • 132,665
  • 89
  • 401
  • 465

3 Answers3

221

$true and $false.

Those are constants, though. There are no language-level literals for Booleans.

Depending on where you need them, you can also use anything that coerces to a Boolean value, if the type has to be Boolean, e.g., in method calls that require Boolean (and have no conflicting overload), or conditional statements. Most non-null objects are true, for example. null, empty strings, empty arrays and the number 0 are false.

Peter Mortensen
  • 30,738
  • 21
  • 105
  • 131
Joey
  • 344,408
  • 85
  • 689
  • 683
  • Thank you for this concise and accurate answer. It really seems that Powershell is falling back on old mistakes here, though. Why *coerce* any values... especially so loosely such that anything can be compared to a boolean? But I am confused what the difference is between `$true`, `True`, and `true`. Eg, `7 -eq 7` yields `True` (not `$True`). Azure commands, such as `az group exists -n "MyResourceGroup"` yields `true` (note lower case). What is going on? Why so inconsistent? All of these -- `$true`, `True`, and `true` -- are equal to `$true` when performing `True -eq $true`, etc. – Mike Williamson Apr 07 '21 at 15:06
  • 3
    @Mike: `True`/`False` is simply the string representation of a boolean. `true` should never appear in PowerShell; it's the C# literal for a boolean. In your Azure example I'd guess it's a string returned from an API. `$true` is effectively the PowerShell "literal" (technically a constant variable) for a boolean. Coercion is common for dynamic languages that allow a range of conditions to be simplified; look at JavaScript and others. It's simply a direction of language design, not merely a mistake. – Joey Apr 12 '21 at 07:52
21

[bool]1 and [bool]0 also works.

Colonel Panic
  • 132,665
  • 89
  • 401
  • 465
  • 4
    To be precise, you can use lots of things that can be coerced to boolean in contexts where conversion is taking place, e.g. in a conditional statement. And in those cases you don't need to cast at all. `if ($s.Length) { ... }` is perfectly fine, for example. – Joey Oct 01 '14 at 12:41
  • For completeness, you can also produce boolean value by doing `New-Object -Type Boolean` for `false` and `! (New-Object -Type Boolean)` for `true` – Raghu Dodda Sep 05 '20 at 01:36
8

To add more information to already existing answers: The Boolean literals $true and $false also work as is when used as command line parameters for PowerShell scripts. For the below PowerShell script which is stored in a file named installmyapp.ps1:

param (
    [bool]$cleanuprequired
)

echo "Batch file starting execution."

Now if I've to invoke this PowerShell file from a PowerShell command line, this is how I can do it:

installmyapp.ps1 -cleanuprequired $true

OR

installmyapp.ps1 -cleanuprequired 1

Here 1 and $true are equivalent. Also, 0 and $false are equivalent.

Note: Never expect that string literal true can get automatically converted to boolean. For example, if I run the below command:

installmyapp.ps1 -cleanuprequired true

it fails to execute the script with the below error:

Cannot process argument transformation on parameter 'cleanuprequired'. Cannot convert value "System.String" to type "System.Boolean". Boolean parameters accept only Boolean values and numbers, such as $True, $False, 1 or 0.

Peter Mortensen
  • 30,738
  • 21
  • 105
  • 131
RBT
  • 24,161
  • 21
  • 159
  • 240