2

我正在尝试将 ValidateSet 与布尔参数一起使用,但是我无法使其按预期运行。

复制问题的示例:

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

    Process
    {
        $Bool
    }
}

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

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

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

函数的预期输出应该是True什么时候$true被选中,False什么时候$false被选中。

我已经在我的代码中实现了一个解决方法,但我想知道如何使用带有布尔参数的 ValidateSet(如果可能的话)来为用户启用制表符补全功能。

4

3 回答 3

3

加入一些答案,最佳选择将取决于需要,如果参数是 boolean 类型,则可以将其替换为 type switch 之一,但是如果您想在代码中或按样式指定要查看的值;可以按如下方式完成。

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

控制台输出

于 2019-08-19T15:58:37.590 回答
1

您可以ValidateSet在不指定输入变量类型的情况下用于自动完成。但是,在这种情况下,您不能使用0and1作为输入:

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

    Process
    {
        [System.Convert]::ToBoolean($Bool)
    }
}
于 2017-07-12T07:31:47.963 回答
0

这为用户提供了使用 ValidateSet 所需的选项卡完成,但通过注册参数完成器来实现(尤其是在 ISE 中);

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

    Process
    {
        $Bool
    }
}
Register-ArgumentCompleter -CommandName 'Set-Boolean' -ParameterName 'Bool' -ScriptBlock {
    [System.Management.Automation.CompletionResult]::new(
        '$False',
        '$False',
        'ParameterValue',
        '[bool] False'
    )
    [System.Management.Automation.CompletionResult]::new(
        '$True',
        '$True',
        'ParameterValue',
        '[bool] True'
    )
}
于 2021-11-09T14:34:26.117 回答