PowerShell字符串默认参数值无法按预期工作

D.R*_*.R. 26 powershell powershell-4.0

#Requires -Version 2.0

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

if($MyParam -eq $null) {
  Write-Host 'works'
} else {
  Write-Host 'does not work'
}
Run Code Online (Sandbox Code Playgroud)

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

D.R*_*.R. 29

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

假设:

Param(
  [string] $stringParam = $null
)
Run Code Online (Sandbox Code Playgroud)

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

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

# WILL work:
if ($stringParam -eq "" -and $stringParam -eq [String]::Empty)
{
}
Run Code Online (Sandbox Code Playgroud)

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

Param(
  [string] $stringParam = [System.Management.Automation.Language.NullString]::Value
)
Run Code Online (Sandbox Code Playgroud)

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

奇怪的!

  • 请注意,在PowerShell中,您应该真正使用`if($ null -eq $ value)`而不是`if($ value -eq $ null)`。PowerShell脚本分析器模块也会对此发出警告。参见https://www.spcaf.com/blog/powershell-null-comparison/ (2认同)

oɔɯ*_*ɯǝɹ 11

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

[CmdletBinding()]
Param (
    [Parameter()] 
    [AllowNull()]
    [string] $MyParam
)
Run Code Online (Sandbox Code Playgroud)

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

if ($null -eq $MyParam)
Run Code Online (Sandbox Code Playgroud)

如果你想让它以可预测的方式工作