在 PowerShell 中包含“`”(急性)字符时类似字符串的比较失败

String -like comparison failing when it includes "`" (Acute) character in PowerShell

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

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

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

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

如果您想要进行精确的字符串比较而不必担心转义引用字符串,请使用 -eq

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

加到:

有时您可能正在处理应该成为 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 开始,有一个 bug: ` 本身,甚至认为它应该被转义为 ``没有转义,Mathias 在GitHub issue #16306.

中报告了这一点

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