如何在PowerShell中使用变量正确搜索含通配符的字符?
PowerShell中
-like结合含通配符字符的变量时的匹配问题 我在PowerShell里做字符串比较时常用-like操作符,但遇到一个麻烦:当匹配模板里的变量包含通配符特殊字符(比如[)时,会触发语法错误,没法按字面内容匹配。
字符串直接匹配的示例
直接写模板字符串时,能正常匹配:
$Test = 'My string' $Test -like "My*" # 输出:True
但如果模板里有[这种通配符特殊字符,直接写就会报错,必须用反引号转义才能正常匹配:
$Test = '[My string]' $Test -like "[My*" # 报错:WildcardPatternException: The specified wildcard character pattern is not valid: [My* $Test -like '`[My*' # 输出:True
变量作为匹配模板的问题
如果把匹配的前缀存在变量里,正常情况没问题:
$Test = 'My string' $Search = 'My' $Test -like "$Search*" # 输出:True
但变量里包含[时,直接拼接就会报错,因为[被当成了通配符模式的一部分:
$Test = '[My string]' $Search = '[My' $Test -like "$Search*" # 报错:WildcardPatternException: The specified wildcard character pattern is not valid: [My*
我需要的是用$Search的字面内容来做前缀匹配,而不是让它被解析成通配符模式。
临时方案的局限
目前我能想到的临时办法是把[从变量里去掉,用包含匹配:
$Test = '[My string]' $Search = 'My' $Test -like "*$Search*" # 输出:True
但这样会匹配所有包含My的字符串,没法精确匹配以[My开头的内容,不符合需求。
正确解决方法
要让变量里的特殊字符按字面匹配,需要用[WildcardPattern]::Escape()方法转义变量中的通配符特殊字符(包括[、]、*、?等),然后再拼接通配符:
$Test = '[My string]' $Search = '[My' # 转义变量中的特殊字符 $escapedSearch = [WildcardPattern]::Escape($Search) # 拼接通配符后执行匹配 $Test -like "$escapedSearch*" # 输出:True
这个方法会把$Search里的[转义成```[,这样-like就会把它当成普通字符处理,同时保留我们需要的*`通配符功能,实现精确的前缀匹配。
内容的提问来源于stack exchange,提问作者Dennis
相关产品推荐
相关产品推荐

