【发布时间】:2024-01-05 13:29:01
【问题描述】:
下面的比较是在 PowerShell 中给出错误的结果,希望它是真的。 ` 运算符导致它为 false,而对于任何其他特殊字符,它返回 true。
> 'abc`@01' -like 'abc`@01'
False
【问题讨论】:
标签: powershell escaping backticks
下面的比较是在 PowerShell 中给出错误的结果,希望它是真的。 ` 运算符导致它为 false,而对于任何其他特殊字符,它返回 true。
> 'abc`@01' -like 'abc`@01'
False
【问题讨论】:
标签: powershell escaping backticks
-like 是通配符比较运算符,` 是通配符转义序列。
PS ~> 'abc`@01' -like 'abc``@01'
True
如果您想要一个精确的字符串比较而不必担心转义参考字符串,请使用-eq:
PS ~> 'abc`@01' -eq 'abc`@01'
True
【讨论】:
添加到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 中报告了这一点。
换句话说:使用您问题中的特定通配符模式,此技术将不起作用。
【讨论】: