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



下面的比较在PowerShell中给出假结果,希望它是真的。'操作符导致它为假,而对于任何其他特殊字符,它返回真。

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

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

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

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

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

添加到Mathias R. Jessen的有用答案:

有时您可能正在处理应该成为通配符表达式部分的字符串,但是本身应该按照的意思处理,这需要`转义通配符元字符* ? [ ] `

[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问题#16306中报告过。

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

最新更新