Safely converting string to bool in PowerShell

前端 未结 6 1343
孤城傲影
孤城傲影 2020-12-18 19:03

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

相关标签:
6条回答
  • 2020-12-18 19:26

    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

    0 讨论(0)
  • 2020-12-18 19:36
    $a = 'bla'
    $a = ($a -eq [bool]::TrueString).tostring()
    $a
    
    False
    
    0 讨论(0)
  • 2020-12-18 19:40

    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
        }
    }
    
    0 讨论(0)
  • 2020-12-18 19:42

    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.

    0 讨论(0)
  • 2020-12-18 19:44

    You could use a try / catch block:

    $a = "bla"
    try {
      $result = [System.Convert]::ToBoolean($a) 
    } catch [FormatException] {
      $result = $false
    }
    

    Gives:

    > $result
    False
    
    0 讨论(0)
  • 2020-12-18 19:45

    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"
    }
    
    0 讨论(0)
提交回复
热议问题