我试图使用带有布尔参数的ValidateSet但是我无法按预期运行它。
复制问题的示例:
function Set-Boolean
{
[CmdletBinding()]
[OutputType([Bool])]
Param
(
[Parameter(Mandatory=$true, Position=0)]
[ValidateNotNullOrEmpty()]
[ValidateSet($false,$true)]
[Bool] $Bool
)
Process
{
$Bool
}
}
在运行时,PowerShell会在选项卡完成时将$true
和$false
变量分别扩展为True
和False
,但这会导致参数验证失败,因为只有{{ 1}},$true
,$false
和1
是有效的布尔类型。
我尝试将ValidateSet更改为0
,并且标签完成按预期工作,但参数验证仍然失败,因为参数需要字符串[ValidateSet('$false','$true')]
和'$false'
。
我可以将ValidateSet更改为'$true'
并让其按预期运行,但我发现[ValidateSet([bool]0,[bool]1)]
和0
的用户体验比1
和$true
更差用于完成布尔参数。
当选择$false
时,函数的预期输出应为True
;选择$true
时,False
的预期输出应为$false
。
我已经在我的代码中实现了一种解决方法,但是我想知道如何使用带有布尔参数的ValidateSet,如果可能的话,为用户启用tab完成功能。
答案 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
答案 1 :(得分:1)
您可以使用ValidateSet
进行自动完成,而无需指定输入变量类型。但是,在这种情况下,您无法使用0
和1
作为输入:
function Set-Boolean
{
[CmdletBinding()]
[OutputType([Bool])]
Param
(
[Parameter(Mandatory=$true, Position=0)]
[ValidateNotNullOrEmpty()]
[ValidateSet($false,$true)]
$Bool
)
Process
{
[System.Convert]::ToBoolean($Bool)
}
}