powershell中使用null参数的行为不一致

时间:2017-09-11 17:18:20

标签: powershell parameters null

我需要在powershell中编写一个函数来分辨一个未被传递的'参数'从一个传递的字符串为空(或任何其他字符串)

我是这样写的:

function Set-X {
    param(
    [AllowNull()][string]$MyParam = [System.Management.Automation.Language.NullString]::Value
    )

    if ($null -ne $MyParam) { write-host 'oops' }
    else { write-host 'ok' }
}

如果我在没有来自ISE的参数的情况下调用Set-X,它会按照我的预期工作并打印“确定”。

但是,如果我从普通控制台那样做,那就会打印出#oops'。

发生了什么事?这样做的正确方法是什么?

2 个答案:

答案 0 :(得分:1)

允许用户传入参数参数值$null并不会改变powershell将尝试将其转换为[string]的事实。

将powershell中的$null值转换为字符串会产生一个空字符串:

$str = [string]$null
$null -eq $str # False
'' -eq $str    # True

(同样适用于$null -as [string]"$null"

如果您不仅要允许 MyParam,还要接受 $null,请删除$null参数上的类型约束参数值:

function Set-X {
    param(
    [AllowNull()]$MyParam = [System.Management.Automation.Language.NullString]::Value
    )

    if ($null -ne $MyParam) { write-host 'oops' }
    else { write-host 'ok' }
}

答案 1 :(得分:0)

正如Mathias和BenH所写,罪魁祸首将$ null强制转换为[string]类型,这将导致一个空字符串:

 [string]$null -eq '' #This is True

但是要使Mathias答案中的示例代码正常工作,我们还必须替换

[System.Management.Automation.Language.NullString]::Value

带有$ null

function Set-X {
    param(
    [AllowNull()]$MyParam = $null
    )

    if ($null -ne $MyParam) { write-host 'oops' }
    else { write-host 'ok' }
}