为什么将$ null传递给带有AllowNull()的参数会导致错误?

时间:2015-08-05 21:49:51

标签: powershell parameters nullable

请考虑以下代码:

function Test
{
    [CmdletBinding()]
    param
    (
        [parameter(Mandatory=$true)]
        [AllowNull()]
        [String]
        $ComputerName
    ) 
    process{}
}

Test -ComputerName $null

基于the official documentation for AllowNull,我希望$ComputerName可以是[string]$null。但是,运行上面的代码会导致以下错误:

  

[14,24:Test]无法将参数绑定到参数' ComputerName'因为它是空的   字符串。

为什么在这种情况下不为$ComputerName传递$ null?

2 个答案:

答案 0 :(得分:6)

$null,转换为[string]时,返回空字符串$null

[string]$null -eq $null # False
[string]$null -eq [string]::Empty # True

如果您想为{string]参数传递$null,请使用[NullString]::Value

[string][NullString]::Value -eq $null # True
Test -ComputerName ([NullString]::Value)

答案 1 :(得分:3)

如果您计划允许空值为空字符串,则还需要添加[AllowEmptyString()]属性。

function Test
{
    [CmdletBinding()]
    param
    (
        [parameter(Mandatory=$true)]
        [AllowNull()]
        [AllowEmptyString()]
        [String]
        $ComputerName
    ) 
    process{}
}

Test -ComputerName $null