Reputation: 4209
Consider the following code:
function Test
{
[CmdletBinding()]
param
(
[parameter(Mandatory=$true)]
[AllowNull()]
[String]
$ComputerName
)
process{}
}
Test -ComputerName $null
Based on the official documentation for AllowNull
I was expecting that $ComputerName
could either be [string]
or $null
. However, running the above code results in the following error:
[14,24: Test] Cannot bind argument to parameter 'ComputerName' because it is an empty string.
Why doesn't passing $null for $ComputerName
work in this case?
Upvotes: 1
Views: 5384
Reputation: 1
As noted, when cast to a [string], $null becomes an empty string (""). To avoid this, one option is to type the param as an object - then in the body test first for $null, then check that $MyParam.GetType().Name is "String".
Upvotes: 0
Reputation: 22102
$null
, when converted to [string], return empty string not $null
:
[string]$null -eq $null # False
[string]$null -eq [string]::Empty # True
If you want to pass $null
for [string] parameter you should use [NullString]::Value
:
[string][NullString]::Value -eq $null # True
Test -ComputerName ([NullString]::Value)
Upvotes: 8
Reputation: 26719
You also need to add the [AllowEmptyString()]
attribute if you plan on allowing nulls and empty strings.
function Test
{
[CmdletBinding()]
param
(
[parameter(Mandatory=$true)]
[AllowNull()]
[AllowEmptyString()]
[String]
$ComputerName
)
process{}
}
Test -ComputerName $null
Upvotes: 3