在 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.
换句话说:对于您问题中的特定通配符模式,此技术将不起作用。