-in 和 -contains 语法方向相反:-in 是“值在集合中”,-contains 是“集合包含值”;-in 更符合自然语序、推荐初学者使用,而 -contains 对字符串仅按字符匹配,不支持子串搜索。
-in 和 -contains 都是用来判断某个值是否存在于集合中的运算符,但它们的**操作顺序和语法方向相反**,用错容易返回意外结果。
语法方向:谁在谁里面?
这是最常混淆的一点:
-
$value -in $collection→ “这个值 在 那个集合里吗?”(自然语序,推荐初学者优先用) -
$collection -contains $value→ “这个集合 包含 那个值吗?”(主谓宾倒置,需注意左操作数必须是集合)
支持的数据类型
两者都支持常见集合类型,包括:
- 数组:
@('a','b','c') - 哈希表的键或值(需显式提取):
@{x=1;y=2}.Keys - 字符串(会被当作字符数组处理):
'hello' -contains 'e'→True(因为'e'是其中一个字符) - 注意:
[string]类型本身不是“集合容器”,但 PowerShell 会隐式展开为[char[]]来支持-contains;-in对字符串右操作数不自动展开,所以'e' -in 'hello'返回False(除非你写成'e' -in 'hello'.ToCharArray())
大小写与空格敏感性
默认都区分大小写,且严格匹配(含空格、不可见字符):
-
'Apple' -in @('apple','banana')→False - 如需忽略大小写,可先统一转换:
$value.ToLower() -in $collection.ForEach({$_.ToLower()}),或用正则、-like等替代方案 - 检查前建议用
.Trim()处理可能的首尾空格,尤其从文件或用户输入读取时
实际使用建议
- 优先用
-in:语义清晰、不易写反,尤其在if判断中更接近自然语言 - 避免对单个字符串直接用
-contains做子串搜索——它不等价于-match或-like。要查子串请用-match 'pattern'或.Contains()方法 - 在循环或管道中配合
Where-Object使用时,-in更易读:$list | Where-Object { $_ -in @('start','stop','pause') }


















