about_Operator_Precedence

简短说明

按优先顺序列出了 PowerShell 运算符。

长说明

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

当运算符具有相同优先级时,PowerShell 会按它们在表达式中的顺序从左到右计算它们。 例外情况是赋值运算符、强制转换运算符和求反运算符(!-not-bnot),这些运算符是从右到左计算。

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

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

“运算符”列中列出了运算符。 “参考”列中列出了介绍运算符的 PowerShell 帮助主题。 若要显示主题,请键入 get-help <topic-name>

OPERATOR 引用
$() @() () @{} about_Operators
. ?.(成员访问) about_Operators
::(静态) about_Operators
[0] ?[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 -ge -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

下列各项不是真正的运算符。 它们是 PowerShell 命令语法的一部分,而不是表达式语法的一部分。 赋值始终是最后一个发生的操作。

SYNTAX 引用
.(点式寻源) about_Operators
&(调用) about_Operators
? <if-true> : <if-false>(三元运算符) about_Operators
??(空值合并运算符) about_Operators
|(管道运算符) about_Operators
> >> 2> 2>> 2>&1 about_Redirection
&& ||(管道链运算符) about_Operators
= += -= *= /= %= ??= 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} )

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

以下示例演示了索引运算符优先于强制转换运算符。

此表达式创建一个包含三个字符串的数组。 然后,它使用值为 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

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

另请参阅