#Requires -Version 2.0
[CmdletBinding()]
Param(
[Parameter()] [string] $MyParam = $null
)
if($MyParam -eq $null) {
Write-Host 'works'
} else {
Write-Host 'does not work'
}
输出"不起作用"=>看起来字符串从空字符串隐式转换为空字符串?为什么?以及如何测试字符串是空的还是真的$null?这应该是两个不同的值!
好的,找到了答案@ 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)
{
}
或者,您可以指定特殊的空类型:
Param(
[string] $stringParam = [System.Management.Automation.Language.NullString]::Value
)
在这种情况下,$null -eq $stringParam
将按预期工作。
奇怪!
如果要允许字符串参数$null
,则需要使用 AllowNull
属性:
[CmdletBinding()]
Param (
[Parameter()]
[AllowNull()]
[string] $MyParam
)
请注意,您应该在比较的左侧使用$null:
if ($null -eq $MyParam)
如果您希望它以可预测的方式工作
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
如果您希望保留$null值,则不要声明参数的类型:
Param(
$stringParam
)
(声明类型时,其他解决方案都不适合我。
出于何种原因,[string]
类型的参数的默认值似乎为 $null
默认为空字符串。
选项 1
if ($stringParam) { ... }
选项 2
if ($stringParam -eq "") { ... }
选项 3
if ($stringParam -eq [String]::Empty) { ... }