1

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?

4
  • I can't give you a definitive explanation, but to me it looks like $null is cast to an empty string, due to the parameter type, and thus isn't covered by the validation attribute anymore. Using AllowEmptyString() instead works. I'd consider this a documentation bug. Commented Aug 5, 2015 at 22:09
  • related Commented Aug 25, 2017 at 15:02
  • But you can't do Test -ComputerName with no value specified? Why not? Commented Oct 17, 2024 at 15:11
  • @johnvkumpf Because the attribute parameter has argument Mandatory=true. Commented Oct 18, 2024 at 15:40

3 Answers 3

8

$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)
Sign up to request clarification or add additional context in comments.

1 Comment

Just one warning, tihs doesnt work on 2.0 as far as i could say
3

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

Comments

0

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".

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.