为何PowerShell中两种-Like运算符写法一报错一正常?
PowerShell两种Where-Object写法差异解析
第一种写法报错的原因
你用的是Where-Object的简化位置语法(简写为?),这种语法仅支持定义单个条件,固定格式为:
? <属性名> <比较运算符> <匹配值>
它无法直接通过-Or/-And连接多个独立的条件判断。你写的? EmailAddress -like *gmail.com -Or ? EmailAddress -like *outlook.com违反了该规则:
- PowerShell会把第一个
?后的内容解析为一个Where-Object条件,但第二个?会被识别为新的命令,直接导致语法混乱; - 即便去掉第二个
?,简化语法也不支持在同一行用-Or追加第二个-Like条件——它的设计初衷就是适配单一条件的简单过滤场景。
另外补充:你第一个条件里的*gmail.com未加引号,PowerShell会将其视为变量而非通配符字符串,这也是潜在的语法问题。
第二种写法正常的原因
你改用的是Where-Object的脚本块语法,这是PowerShell处理复杂条件的标准写法:
Where-Object { $_.EmailAddress -Like "*gmail.com" -Or $_.EmailAddress -Like "*outlook.com" }
脚本块{ ... }内部可以编写任意合法的PowerShell布尔表达式:
- 通过
$_.属性名明确引用管道对象的属性; - 用
-Or/-And自由组合多个比较条件,完全符合PowerShell的表达式解析规则,因此能正确执行多条件过滤逻辑。
总结
- 简化语法仅适用于单一条件过滤,写法简洁但功能有限;
- 脚本块语法适配所有过滤场景,尤其是多条件组合的复杂需求,灵活性更强。
内容的提问来源于stack exchange,提问作者Tan Yu Hau Sean
相关产品推荐
相关产品推荐

