33
#Requires -Version 2.0

[CmdletBinding()]
Param(
  [Parameter()] [string] $MyParam = $null
)

if($MyParam -eq $null) {
  Write-Host 'works'
} else {
  Write-Host 'does not work'
}

输出“不起作用”=> 看起来字符串从 null 隐式转换为空字符串?为什么?以及如何测试一个字符串是空的还是真的 $null?这应该是两个不同的值!

4

5 回答 5

37

好的,找到了答案@https ://www.codykonior.com/2013/10/17/checking-for-null-in-powershell/

假设:

Param(
  [string] $stringParam = $null
)

并且未指定参数(使用默认值):

# will NOT work
if ($null -eq $stringParam)
{
}

# WILL work:
if ($stringParam -eq "" -and $stringParam -eq [String]::Empty)
{
}

或者,您可以指定一个特殊的 null 类型:

Param(
  [string] $stringParam = [System.Management.Automation.Language.NullString]::Value
)

在这种情况下,$null -eq $stringParam它将按预期工作。

诡异的!

于 2014-04-07T07:52:29.447 回答
14

AllowNull如果要允许$null字符串参数,则需要使用该属性:

[CmdletBinding()]
Param (
    [Parameter()] 
    [AllowNull()]
    [string] $MyParam
)

请注意,您应该在比较的左侧使用 $null

if ($null -eq $MyParam)

如果你想让它按预期工作

于 2015-06-16T21:35:40.470 回答
3

看到许多与 [String]::Empty 的相等比较,您可以使用 [String]::IsNullOrWhiteSpace 或 [String]::IsNullOrEmpty 静态方法,如下所示:

param(
    [string]$parameter = $null
)

# we know this is false
($null -eq $parameter)

[String]::IsNullOrWhiteSpace($parameter)
[String]::IsNullOrEmpty($parameter)
('' -eq $parameter)
("" -eq $parameter)

产生:

PS C:\...> .\foo.ps1
False
True
True
True
True
于 2016-08-17T00:53:15.060 回答
3

如果您希望保留 $null 值,请不要声明参数的类型

Param(
    $stringParam
)

(在声明类型时,没有其他解决方案对我有用。)

于 2017-02-16T18:28:32.577 回答
1

因此,无论出于何种原因$null,类型参数的默认值似乎都默认为空字符串。[string]

选项1

if ($stringParam) { ... }

选项 2

if ($stringParam -eq "") { ... }

选项 3

if ($stringParam -eq [String]::Empty) { ... }
于 2015-06-04T11:41:50.423 回答