-
Notifications
You must be signed in to change notification settings - Fork 8.1k
Description
In response to #4036, passing Booleans to [switch] parameters was fixed.
However, the problem persists for [bool] parameters if you pass the value as a separate argument (-param value), which is the typical syntax; by contrast, -param:value (the form that you must use with [switch] parameters) works fine (but using : and whitespace - -param: value - is also broken).
While [bool] parameters are rare, there's no reason for them not to be supported.
Additionally, the -param: value syntax form (: separator and whitespace) also doesn't work with [switch] parameters, only -param:value does (:, but no whitespace).
Also, given that [bool] parameters (but not [switch] parameters) also accepts numbers inside PowerShell - notably 1 for $true and 0 for $false (e.g., & { param([bool] $p) $p } 1 yields $true) - passing numbers should be supported too.
Steps to reproduce
Describe "-File with Booleans" {
BeforeAll {
Push-Location testdrive:\
'param([bool] $foo) $foo' > testB.ps1
'param([switch] $foo) $foo.IsPresent' > testS.ps1
}
# [switch] parameter
It "[switch] param: `$true can be passed with ':' and *no* whitespace" {
pwsh -noprofile -file ./testS.ps1 -foo:`$true | Should -Be 'True'
}
It "[switch] param: `$true can be passed with ':' *with* whitespace" {
# Note the escaped $, so that '$true' is passed as a string.
# However, it should work even without escaping, in which case 'True' is passed.
pwsh -noprofile -file ./testS.ps1 -foo: `$true | Should -Be 'True'
}
# [bool] parameter
It "[bool] param: `$true can be passed with ':' and *no* whitespace" {
# Note the escaped $, so that '$true' is passed as a string.
# However, it should work even without escaping, in which case 'True' is passed.
pwsh -noprofile -file ./testB.ps1 -foo:`$true | Should -Be 'True'
}
It "[bool] param: `$true can be passed with ':' *with* whitespace" {
pwsh -noprofile -file ./testB.ps1 -foo: `$true | Should -Be 'True'
}
# A [bool] parameter - unlike [switch] - *requires* an explicit argument,
# so you should be able to pass it with the customary value-as-separate
# argument syntax.
It "[bool] param: `$true can be passed as a *separate argument*" {
pwsh -noprofile -file ./testB.ps1 -foo `$true | Should -Be 'True'
}
# A [bool] parameter - unlike [switch] - also supports *numbers* as arguments
# where 0 is coerced to $false and 1 (any nonzero number) to $true
It "[bool] param: 1 can be passed for $true" {
pwsh -noprofile -file ./testB.ps1 -foo:1 | Should -Be 'True'
}
It "[bool] param: 0 can be passed for $false" {
pwsh -noprofile -file ./testB.ps1 -foo:0 | Should -Be 'False'
}
AfterAll {
Pop-Location
}
}Expected behavior
The test should pass.
Actual behavior
All tests except the ones with syntax form -foo:$true fail:
Expected $true, but got @('.../test.ps1 : Cannot process argument transformation on parameter 'foo'.
Cannot convert value "System.String" to type "System.Boolean". Boolean parameters accept only Boolean values and numbers, such as $True, $False, 1 or 0.
Environment data
PowerShell Core 7.0.0-preview.4