考虑以下陈述:
Get-ChildItem -Recurse *.vbs | Where-Object{$_.name -like "d*" -and $_.name -like "*s"}
Get-ChildItem -Recurse *.vbs | Where-Object{($_.name -like "d*") -and ($_.name -like "*s")}
它们将产生完全相同的输出。我一直认为第一个陈述会失败,因为条件不在括号中。
查看about_Logical_Operators -and
和-or
的示例会显示这些括号。
(1 -eq 1) -or (1 -eq 2)
但是Using the Where-Object Cmdlet的技术网文章显示了这个例子
$_.handles -gt 200 -and $_.name -eq "svchost"
有一段时间我一直在告诉人们使用括号,因为"否则它将不起作用"。差异纯粹是装饰性的,最终无关紧要,我只是在推动个人偏好?
答案 0 :(得分:2)
如果查看Windows PowerShell 3.0 Specification document,请在第7.10节(逻辑运算符)中说明:
逻辑AND运算符 - 并转换由其指定的值 必要时操作的bool(§6.2)。结果是逻辑AND 可能转换的操作数值,并具有类型bool。如果 左操作数计算结果为False,不评估右操作数。 逻辑OR运算符 - 或转换由其指定的值 必要时操作的bool(§6.2)。结果是逻辑OR 可能转换的操作数值,并且类型为bool。如果是左边 操作数计算结果为True,不评估右操作数。该 逻辑XOR运算符-xor转换由其指定的值 bool的操作数(§6.2)。结果是可能的逻辑异或 转换的操作数值,并具有类型bool。
这些运算符是左关联的。
因此,这决定了添加(或不添加)括号的规则。