关于运算符优先级

简短说明

按优先顺序Lists PowerShell 运算符。

详细说明

使用 PowerShell 运算符可以构造简单但功能强大的表达式。 本主题按优先顺序列出了运算符。 优先顺序是当多个运算符出现在同一表达式中时,PowerShell 计算运算符的顺序。

当运算符的优先级相等时,PowerShell 在表达式中显示时从左到右计算它们。 例外是赋值运算符、强制转换运算符和求反运算符 (!-not-bnot) ,它们从右到左求值。

可以使用括号(如括号)替代标准优先顺序,并强制 PowerShell 在未封闭部分之前计算表达式的封闭部分。

在以下列表中,运算符按计算顺序列出。 同一行或同一组中的运算符具有相同的优先级。

“运算符”列列出了运算符。 “引用”列列出了描述运算符的 PowerShell 帮助主题。 若要显示主题,请键入 get-help <topic-name>

OPERATOR 参考
$() @() () @{} about_Operators
. (成员访问) about_Operators
:: (静态) about_Operators
[0] (索引运算符) about_Operators
[int] (强制转换运算符) about_Operators
-split (一元) about_Split
-join (一元) about_Join
, (逗号运算符) about_Operators
++ -- about_Assignment_Operators
! -not about_Logical_Operators
.. (范围运算符) about_Operators
-f (格式运算符) about_Operators
- (一元/负) about_Arithmetic_Operators
* / % about_Arithmetic_Operators
+ - about_Arithmetic_Operators

以下运算符组的优先级相同。 它们的区分大小写和显式不区分大小写的变体具有相同的优先级。

OPERATOR 参考
-split(二元) about_Split
-join(二元) about_Join
-is -isnot -as about_Type_Operators
-eq -ne -gt -gt -lt -le about_Comparison_Operators
-like -notlike about_Comparison_Operators
-match -notmatch about_Comparison_Operators
-in -notIn about_Comparison_Operators
-contains -notContains about_Comparison_Operators
-replace about_Comparison_Operators

此列表将按优先顺序使用以下运算符恢复:

OPERATOR 参考
-band -bnot -bor -bxor -shr -shl about_Arithmetic_Operators
-and -or -xor about_Logical_Operators

以下项不是 true 运算符。 它们是 PowerShell 命令语法的一部分,而不是表达式语法的一部分。 分配始终是发生的最后一个操作。

SYNTAX 参考
. (点源) about_Operators
& (调用) about_Operators
| (管道运算符) about_Operators
> >> 2> 2>> 2>&1 about_Redirection
= += -= *= /= %= about_Assignment_Operators

示例

以下两个命令显示了算术运算符,以及使用括号强制 PowerShell 首先计算表达式的封闭部分的效果。

PS> 2 + 3 * 4
14

PS> (2 + 3) * 4
20

以下示例从本地目录获取只读文本文件,并将其保存在 变量中 $read_only

$read_only = Get-ChildItem *.txt | Where-Object {$_.isReadOnly}

它等效于以下示例。

$read_only = ( Get-ChildItem *.txt | Where-Object {$_.isReadOnly} )

由于管道运算符 (|) 的优先级高于赋值运算符 (=) ,因此 cmdlet 获取的文件Get-ChildItem在分配给$read_only变量之前会发送到 Where-Object cmdlet 进行筛选。

以下示例演示索引运算符优先于 cast 运算符。

此表达式创建一个包含三个字符串的数组。 然后,它使用值为 0 的索引运算符来选择数组中的第一个对象,即第一个字符串。 最后,它将所选对象强制转换为字符串。 在这种情况下,强制转换不起作用。

PS> [string]@('Windows','PowerShell','2.0')[0]
Windows

此表达式使用括号强制在索引选择之前执行强制转换操作。 因此,整个数组被强制转换为 (单个) 字符串。 然后,索引运算符选择字符串数组中的第一项,即第一个字符。

PS> ([string]@('Windows','PowerShell','2.0'))[0]
W

在下面的示例中,由于 -gt (大于) 运算符的优先级高于 -and (逻辑 AND) 运算符,因此表达式的结果为 FALSE。

PS> 2 -gt 4 -and 1
False

它等效于以下表达式。

PS> (2 -gt 4) -and 1
False

如果 -and 运算符具有更高的优先级,则答案将为 TRUE。

PS> 2 -gt (4 -and 1)
True

但是,此示例演示了管理运算符优先级的一个重要原则。 当表达式难以解释时,使用括号来强制计算顺序,即使它强制使用默认运算符优先级也是如此。 括号向阅读和维护脚本的人员表明你的意图。

另请参阅

about_Operators

about_Assignment_Operators

about_Comparison_Operators

about_Arithmetic_Operators

about_Join

about_Redirection

about_Scopes

about_Split

about_Type_Operators