PowerShell中如何用-notlike运算符验证数组无通配符匹配项?
PowerShell中
-like与-notlike的数组匹配行为 -like运算符的基础用法
使用-like运算符对字符串进行通配符匹配很简单:
$myString = "abcdefghi" if ($myString -like "*ef*") { return $true } else {return $false} # 返回结果: True
它同样适用于数组:
$myArray = @("abc", "def", "ghi") if ($myArray -like "*ef*") { return $true } else {return $false} # 返回结果: True if ($myArray -like "*xyz*" ) { return $true } else {return $false} # 返回结果: False if ($myArray -like "*efg*") { return $true } else {return $false} # 返回结果: False
从最后一个示例可知,-like运算符会对数组中的每个元素单独进行通配符匹配,这一特性很实用(efg中的g属于下一个元素,不会跨元素匹配)。
-notlike的数组匹配问题
但-notlike运算符并不遵循上述逻辑:
$myArray = @("abc", "def", "ghi") if ($myArray -notlike "*ef*") { return $true } else {return $false} # 返回结果: True if ($myArray -notlike "*xyz*") { return $true } else {return $false} # 返回结果: True
无论匹配什么字符串,它始终返回True。这是因为对数组使用-notlike时,运算符会返回所有不匹配指定模式的元素组成的数组;而在if条件判断中,非空数组会被视为$true,只要数组里存在不匹配的元素(大部分情况都存在),条件就会返回True。
用-not对-like取反的正常逻辑
使用-not运算符对-like语句取反时,逻辑是正常的:
$myArray = @("abc", "def", "ghi") if (-not($myArray -like "*ef*")) { return $true } else {return $false} # 返回结果: False if (-not($myArray -like "*xyz*")) { return $true } else {return $false} # 返回结果: True
这种方法可行,但可读性不佳,且无法直观使用-notlike运算符让人困扰。
数组转字符串后的匹配(局限性)
也可将数组转换为字符串后使用-notlike,但会失去对每个元素单独匹配的功能,不过数组转为字符串时元素以空格分隔,勉强生效:
$myArray = @("abc", "def", "ghi") if ([string]$myArray -notlike "*ef*") { return $true } else {return $false} # 返回结果: False if ([string]$myArray -notlike "*efg*") { return $true } else {return $false} # 返回结果: True if ([string]$myArray -notlike "*ef g*") { return $true } else {return $false} # 返回结果: False
问题解答
是否可使用
-notlike运算符验证数组中不存在任何匹配通配符的元素?
直接使用$myArray -notlike "*pattern*"无法实现目标。如前文所述,-notlike对数组操作时返回的是所有不匹配的元素数组,而非布尔值;只要数组中存在至少一个不匹配的元素,这个数组就非空,在if条件中会被判定为$true,无法准确验证“数组中没有任何元素匹配模式”。若不可行,验证数组中不存在任何匹配通配符元素的最简洁方法是什么?
推荐以下几种简洁且可靠的方法:
- 方法一:
-not结合-like(经典写法)
这是PowerShell中处理此类逻辑的常规方式:$myArray = @("abc", "def", "ghi") if (-not ($myArray -like "*ef*")) { $true } else { $false } # 匹配存在时返回False,无匹配时返回True - 方法二:
Where-Object过滤后检查结果
逻辑更直观,适合追求可读性的场景:if (-not ($myArray | Where-Object { $_ -like "*ef*" })) { $true } else { $false } - 方法三:布尔值转换配合
-like
利用空数组转布尔值为$false的特性:if (-not [bool]($myArray -like "*ef*")) { $true } else { $false } - 方法四:PowerShell 7+ 可用
Any()方法
语法更简洁,适合使用新版本PowerShell的场景:if (-not $myArray.Any({ $_ -like "*ef*" })) { $true } else { $false }
内容的提问来源于stack exchange,提问作者Jack Pettersson
相关产品推荐
相关产品推荐

