【问题标题】:PowerShell string default parameter value does not work as expectedPowerShell 字符串默认参数值未按预期工作
【发布时间】:2014-05-19 08:21:00
【问题描述】:
#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?这应该是两个不同的值!

【问题讨论】:

    标签: powershell powershell-4.0


    【解决方案1】:

    好的,找到答案@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 将按预期工作。

    奇怪!

    【讨论】:

    • 请注意,在 PowerShell 中您应该真正使用 if ($null -eq $value) 而不是 if ($value -eq $null)。 PowerShell 脚本分析器模块也会对此发出警告。见spcaf.com/blog/powershell-null-comparison
    • 或者更好的是if ([String::IsNullOrEmpty($stringParam)]),它稍微改变了行为(为了更好的imo),但读起来很好并且消除了顺序问题。无论如何,谢谢,这对我帮助很大。
    【解决方案2】:

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

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

    注意你should use $null on the left-hand side of the comparison:

    if ($null -eq $MyParam)
    

    如果您希望它以可预测的方式工作

    【讨论】:

      【解决方案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
      

      【讨论】:

      • 这个答案并没有真正解决问题中的任何评论(即解释将$null 分配给[string] 参数时的行为)
      • 我以为我回答了这个问题:“以及如何测试一个字符串是空的还是真的是 $null?”
      【解决方案4】:

      如果您希望保留 $null 值,只需 声明参数的类型:

      Param(
          $stringParam
      )
      

      (在声明类型时,其他解决方案都不适合我。)

      【讨论】:

      • 当涉及到我想的字符串时,切换到 javascript 样式的声明和比较(不幸的是)。这篇文章的所有其余部分似乎都反映了 powershell 包袱。
      【解决方案5】:

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

      选项 1

      if ($stringParam) { ... }
      

      选项 2

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

      选项 3

      if ($stringParam -eq [String]::Empty) { ... }
      

      【讨论】:

      • 未分配的我更喜欢If (-not $stringParam) { ... }
      猜你喜欢
      • 2016-07-01
      • 2014-08-20
      • 2021-04-06
      • 2010-12-30
      • 1970-01-01
      • 2019-01-06
      • 2012-10-31
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多