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