基于布尔参数的 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
变量分别扩展为 True
和 False
,但是这会导致参数验证失败,因为只有 $true
、$false
、1
和 0
是有效的布尔类型。
我尝试将 ValidateSet 更改为 [ValidateSet('$false','$true')]
并且制表符完成按预期工作但是参数验证仍然失败,因为参数需要字符串 '$false'
和 '$true'
.
我可以将 ValidateSet 更改为 [ValidateSet([bool]0,[bool]1)]
并使其按预期运行,但我发现 0
和 1
的用户体验比 $true
和 [=12 差=] 用于完成布尔参数。
The expected output of the function should be True
when $true
is chosen and False
when $false
is chosen.
我已经在我的代码中实现了一个变通方法,但我想知道如何使用带有布尔参数的 ValidateSet(如果可能的话)来为用户启用制表符完成功能。
您可以使用 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)
}
}
加入一些答案,最好的选择取决于需要,如果参数是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'
)
}
我正在尝试将 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
变量分别扩展为 True
和 False
,但是这会导致参数验证失败,因为只有 $true
、$false
、1
和 0
是有效的布尔类型。
我尝试将 ValidateSet 更改为 [ValidateSet('$false','$true')]
并且制表符完成按预期工作但是参数验证仍然失败,因为参数需要字符串 '$false'
和 '$true'
.
我可以将 ValidateSet 更改为 [ValidateSet([bool]0,[bool]1)]
并使其按预期运行,但我发现 0
和 1
的用户体验比 $true
和 [=12 差=] 用于完成布尔参数。
The expected output of the function should be True
when $true
is chosen and False
when $false
is chosen.
我已经在我的代码中实现了一个变通方法,但我想知道如何使用带有布尔参数的 ValidateSet(如果可能的话)来为用户启用制表符完成功能。
您可以使用 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)
}
}
加入一些答案,最好的选择取决于需要,如果参数是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'
)
}