【问题标题】:String -like comparison failing when it includes "`" (Acute) character in PowerShell在 PowerShell 中包含“`”(急性)字符时,类似字符串的比较失败
【发布时间】:2024-01-05 13:29:01
【问题描述】:

下面的比较是在 PowerShell 中给出错误的结果,希望它是真的。 ` 运算符导致它为 false,而对于任何其他特殊字符,它返回 true。

> 'abc`@01' -like 'abc`@01'
False

【问题讨论】:

    标签: powershell escaping backticks


    【解决方案1】:

    -like 是通配符比较运算符,` 是通配符转义序列。

    PS ~> 'abc`@01' -like 'abc``@01'
    True
    

    如果您想要一个精确的字符串比较而不必担心转义参考字符串,请使用-eq

    PS ~> 'abc`@01' -eq 'abc`@01'
    True
    

    【讨论】:

      【解决方案2】:

      添加到Mathias R. Jessen's helpful answer:

      有时您可能正在处理应该成为wildcard expression一部分的字符串,但它们本身应该被字面意思处理,这需要转义通配符元字符* ? [ ] `,使用`

      [WildcardPattern]::Escape() 允许您以编程方式 执行此转义(如果字符串是从外部传递的,这尤其有用),如下例所示:

      # The value to use *literally* as part of a wildcard expression below.
      $literalValue = '[1]'
      
      # Escape it for use in the wildcard expression.
      # -> '`[1`]'
      $escapedValue = [WildcardPattern]::Escape($literalValue)
      
      'file[1]' -like ('*' + $escapedValue) # -> $true
      

      遗憾的是,从 PowerShell Core 7.2.0-rc.1 开始,存在一个 错误` 本身,即使认为应该将其转义为 ``不是 逃脱,Mathias 在GitHub issue #16306 中报告了这一点。

      换句话说:使用您问题中的特定通配符模式,此技术将不起作用。

      【讨论】:

        最近更新 更多