基于布尔参数的 PowerShell ValidateSet

PowerShell ValidateSet on Boolean Parameter

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

复制问题的示例:

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

    Process
    {
        $Bool
    }
}

在 运行 时间,PowerShell 在 Tab 完成后将 $true$false 变量分别扩展为 TrueFalse,但是这会导致参数验证失败,因为只有 $true$false10 是有效的布尔类型。

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

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

The expected output of the function should be True when $true is chosen and False when $false is chosen.

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

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

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

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

加入一些答案,最好的选择取决于需要,如果参数是boolean类型可以用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

这会根据需要使用 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'
    )
}