'convert "Yes" or "No" to boolean

I want to parse user values contained in .CSV file. I don't want my users to enter "Yes" or "No" but instead enter "True" or "False". In each case I want to convert to the equivalent boolean values: $true or $false. Ideally I would like a default value, so if there's misspelt "Yes or "No" I would return my default value: $true or $false.

Hence, I wondered if there is a neat way of doing this other than

if(){} else (){}


Solution 1:[1]

One way is a switch statement:

$bool = switch ($string) {
  'yes' { $true }
  'no'  { $false }
}

Add a clause default if you want to handle values that are neither "yes" nor "no":

$bool = switch ($string) {
  'yes'   { $true }
  'no'    { $false }
  default { 'neither yes nor no' }
}

Another option might be a simple comparison:

$string -eq 'yes'            # matches just "yes"

or

$string -match '^y(es)?$'    # matches "y" or "yes"

These expressions would evaluate to $true if the string is matched, otherwise to $false.

Solution 2:[2]

Ah, the magic of powershell functions, and invoke expression.

function Yes { $true }
function No { $false }

$magicBool = & $answer 

Note: This is case insensitive, but will not handle misspellings

Solution 3:[3]

If the only possible values are "Yes" and "No" then probably the simplest way is

$result = $value -eq 'Yes'

With misspelled values and the default $false the above will do as well.

With misspelled values and the default $true this will work

$result = $value -ne 'No'

Solution 4:[4]

All of these are valid approaches. If you are looking for a one liner, this will validate it is an acceptable value and set to boolean true if in the 'true' value set. This will also give you a default $false value.

$result = @("true","false","yes","no") -contains $value -and @("true","yes") -contains $value

For a default $true value you would need something like so.

$result = $true

if (@("true","false","yes","no") -contains $value) {
    $result = @("true","yes") -contains $value
}

Solution 5:[5]

Without a full snippet of your existing code, something like this would probably be an alternative path to take, as opposed to a string of IF statements.

NOTE: This will not handle simple 'Y' or 'N' input, but is case insensitive. So, you should be able to see 'yes' or 'YES' working, as well.

$myVar = Read-Host 'What is your answer?'
switch ($myVar)
{
  Yes {$myVarConverted = $true; break}
  True {$myVarConverted = $true; break}
  No {$myVarConverted = $false; break}
  False {$myVarConverted = $false; break}
  default {"Invalid Input"; break}
}
Write-Host $myVarConverted

Please see my additional comment on your question about the 'misspelling' caveat. That's difficult to code around without specific restrictions or requirements.

Solution 6:[6]

Here's the way I do Yes-No answers:

function ask-user
{
   [CmdletBinding()]
   Param(
      [Parameter(Mandatory=$true)]
      [string] $question
   )
   Process
   {  $answer = read-Host $question
      if ("yes" -match $answer) {$true}
      elseif ("no" -match $answer) {$false}
      else {ask-user $question}
   }
}

You can easily substitute true and false for yes and no.
This one is case insensitive, and will match valid abbreviations. (Y or N). In the case of misspellings, it asks again. Yeah, I could have done it without recursion, but I'm lazy.

Solution 7:[7]

These are great solutions above, but let me just say that this whole topic just proves the vast shortcomings of Powershell...

  [System.Convert]::ToBoolean("False") -eq $true ? 
  [System.Convert]::ToBoolean("0") -eq $true ?  

Really? Give me a f--kin break.

Solution 8:[8]

For me :-

Function convert2Bool($this) { return ($("False","0","","N","No",'$False',"Off") -notcontains [string]$this) }

can adjust if you don't want $null blank-string going to $false, else fine.

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1
Solution 2 Eris
Solution 3
Solution 4 Jim
Solution 5 gravity
Solution 6 Walter Mitty
Solution 7 m1m1k
Solution 8 SimonTi