I\'m trying to convert an argument of my PowerShell script to a boolean value. This line
[System.Convert]::ToBoolean($a)
works fine as long
Another possibility is to use the switch statemement and only evaluate True
, 1
and default
:
$a = "Bla"
$ret = switch ($a) { {$_ -eq 1 -or $_ -eq "True"}{$True} default{$false}}
In this if the string equals to True
$true
is returned. In all other cases $false
is returned.
And another way to do it is this:
@{$true="True";$false="False"}[$a -eq "True" -or $a -eq 1]
Source Ternary operator in PowerShell by Jon Friesen
$a = 'bla'
$a = ($a -eq [bool]::TrueString).tostring()
$a
False
just looked for this again and found my own answer - but as a comment so adding as an answer with a few corrections / other input values and also a pester test to verify it works as expected:
Function ParseBool{
[CmdletBinding()]
param(
[Parameter(Position=0)]
[System.String]$inputVal
)
switch -regex ($inputVal.Trim())
{
"^(1|true|yes|on|enabled)$" { $true }
default { $false }
}
}
Describe "ParseBool Testing" {
$testcases = @(
@{ TestValue = '1'; Expected = $true },
@{ TestValue = ' true'; Expected = $true },
@{ TestValue = 'true '; Expected = $true },
@{ TestValue = 'true'; Expected = $true },
@{ TestValue = 'True'; Expected = $true },
@{ TestValue = 'yes'; Expected = $true },
@{ TestValue = 'Yes'; Expected = $true },
@{ TestValue = 'on'; Expected = $true },
@{ TestValue = 'On'; Expected = $true },
@{ TestValue = 'enabled'; Expected = $true },
@{ TestValue = 'Enabled'; Expected = $true },
@{ TestValue = $null; Expected = $false },
@{ TestValue = ''; Expected = $false },
@{ TestValue = '0'; Expected = $false },
@{ TestValue = ' false'; Expected = $false },
@{ TestValue = 'false '; Expected = $false },
@{ TestValue = 'false'; Expected = $false },
@{ TestValue = 'False'; Expected = $false },
@{ TestValue = 'no'; Expected = $false },
@{ TestValue = 'No'; Expected = $false },
@{ TestValue = 'off'; Expected = $false },
@{ TestValue = 'Off'; Expected = $false },
@{ TestValue = 'disabled'; Expected = $false },
@{ TestValue = 'Disabled'; Expected = $false }
)
It 'input <TestValue> parses as <Expected>' -TestCases $testCases {
param ($TestValue, $Expected)
ParseBool $TestValue | Should Be $Expected
}
}
Prior answers are more complete, but if you know that $foo -eq 1, "1", 0, "0", $true, $false...
anything that can be coerced to an [int]
Either of the following statements
work:
[System.Convert]::ToBoolean([int]$foo)
[System.Convert]::ToBoolean(0 + $foo)
Hope that helps someone that just needs a simple solution.
You could use a try / catch block:
$a = "bla"
try {
$result = [System.Convert]::ToBoolean($a)
} catch [FormatException] {
$result = $false
}
Gives:
> $result
False
TryParse
should work as long as you use ref
and declare the variable first:
$out = $null
if ([bool]::TryParse($a, [ref]$out)) {
# parsed to a boolean
Write-Host "Value: $out"
} else {
Write-Host "Input is not boolean: $a"
}