布尔参数上的PowerShell ValidateSet

时间:2017-07-12 03:11:43

标签: powershell boolean validateset

我试图使用带有布尔参数的ValidateSet但是我无法按预期运行它。

复制问题的示例:

function Set-Boolean
{
    [CmdletBinding()]
    [OutputType([Bool])]
    Param
    (
        [Parameter(Mandatory=$true, Position=0)]
        [ValidateNotNullOrEmpty()]
        [ValidateSet($false,$true)]
        [Bool] $Bool
    )

    Process
    {
        $Bool
    }
}

在运行时,PowerShell会在选项卡完成时将$true$false变量分别扩展为TrueFalse,但这会导致参数验证失败,因为只有{{ 1}},$true$false1是有效的布尔类型。

我尝试将ValidateSet更改为0,并且标签完成按预期工作,但参数验证仍然失败,因为参数需要字符串[ValidateSet('$false','$true')]'$false'

我可以将ValidateSet更改为'$true'并让其按预期运行,但我发现[ValidateSet([bool]0,[bool]1)]0的用户体验比1$true更差用于完成布尔参数。

当选择$false时,函数的预期输出应为True;选择$true时,False的预期输出应为$false

我已经在我的代码中实现了一种解决方法,但是我想知道如何使用带有布尔参数的ValidateSet,如果可能的话,为用户启用tab完成功能。

2 个答案:

答案 0 :(得分:2)

加入一些答案,最好的选择取决于需求,如果参数是布尔型,则可以用类型开关之一代替,但是如果要指定要在代码中或样式中看到的值;可以按照以下步骤进行。

function Write-SwitchParam {
    [CmdletBinding()]
    param (
        [Switch] #[Switch] or [System.Management.Automation.SwitchParameter]
        $SwitchParam
    )

    if($SwitchParam)
    {
        Write-Host "Switch is present. Do Positive Action."
    }
    else {
        Write-Host "Switch isn't present. Do Negative Action."
    }
}

function Write-BooleanParam {
    [CmdletBinding()]
    Param(
    [parameter(Position=0, ValueFromPipeline=$true)]
    [ValidateNotNullOrEmpty()]
    [ValidateSet($true, $false, 0, 1)]
    $BoolParam = $true
    )

    Begin{  
    }

    Process{
        $value = [System.Convert]::ToBoolean($BoolParam)
        Write-Host $value
    }

    End{
    }   
}

Write-Host "TESTS BOOLEAN PARAM" -ForegroundColor Magenta
Write-BooleanParam -BoolParam $true
Write-BooleanParam -BoolParam $false
Write-Host

Write-BooleanParam $false
Write-BooleanParam $true
Write-Host

Write-BooleanParam True
Write-BooleanParam False
Write-Host

Write-BooleanParam 0
Write-BooleanParam 1
Write-Host

Write-BooleanParam
Write-Host

$true, $false, "True", "False", 1, 0 | Write-BooleanParam
Write-Host

Write-Host "TESTS SWITCH PARAM" -ForegroundColor Magenta
Write-SwitchParam 
Write-SwitchParam -SwitchParam

Console Output

答案 1 :(得分:1)

您可以使用ValidateSet进行自动完成,而无需指定输入变量类型。但是,在这种情况下,您无法使用01作为输入:

function Set-Boolean
{
    [CmdletBinding()]
    [OutputType([Bool])]
    Param
    (
        [Parameter(Mandatory=$true, Position=0)]
        [ValidateNotNullOrEmpty()]
        [ValidateSet($false,$true)]
        $Bool
    )

    Process
    {
        [System.Convert]::ToBoolean($Bool)
    }
}