about_Operator_Precedence
应用到: Windows PowerShell 2.0, Windows PowerShell 3.0, Windows PowerShell 4.0
主题
about_Operator_Precedence
简短说明
以优先顺序列出 Windows PowerShell 运算符。
[本主题由 Kirk Munro 编撰,他是来自安大略省渥太华市的一位 Windows PowerShell MVP]
详细说明
借助 Windows PowerShell 运算符,你可以构建简单但功能强大的表达式。本主题按优先顺序列出运算符。当同一表达式中出现多个运算符时,优先顺序是 Windows PowerShell 计算运算符时所依据的顺序。
如果运算符的优先级相同, 则 Windows PowerShell 按照从左到右的顺序计算它们。例外情况是赋值运算符、强制转换运算符和求反运算符(!、-not、-bnot),它们按照从右到左的顺序进行计算。
可以使用括号(如圆括号)覆盖标准优先顺序,并强制 Windows PowerShell 先计算表达式的括起来部分,之后再计算未括起来的部分。
在以下列表中,将按其计算顺序列出运算符。同一行上或同一组中的运算符的优先级相同。
Operator 列列出运算符。Reference 列列出在其中描述运算符的 Windows PowerShell 帮助主题。若要显示主题,请键入“get-help <topic-name>”。
OPERATOR REFERENCE
-------- ---------
$() @() about_Operators
. (dereference) :: (static) about_Operators
[0] (index operator) about_Operators
[int] (cast operators) about_Operators
-split (unary) -join (unary) about_Split, about_Join
, (comma operator) about_Operators
++ -- about_Assignment_Operators
-not ! -bNot about_Logical_Operators, about_Comparison_Operators
.. (range operator) about_Operators
-f (format operator) about_Operators
* / % about_Arithmetic_Operators
+ - about_Arithmetic_Operators
以下运算符组的优先级相同。其区分大小写和显式不区分大小写的变体的优先级相同。
-split (binary) about_Split
-join (binary) 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
该列表在此处继续按优先顺序列出以下运算符:
-band -bor -bxor about_Comparison_Operators
-and -or -xor about_Comparison_Operators
. (dot-source) & (call) about_Scopes, about_Operators
| (pipeline operator) about_Operators
> >> 2> 2>> 2>&1 about_Redirection
= += -= *= /= %= about_Assignment_Operators
示例
以下两个命令演示算术运算符和使用括号强制 Windows PowerShell 首先计算表达式的括起来部分的效果。
C:\PS> 2 + 3 * 4
14
C:\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 的索引运算符选择数组中的第一个对象,该对象是第一个字符串。最后,它将所选的对象强制转换为字符串。在这种情况下,强制转换不起作用。
C:\PS> [string]@('Windows','PowerShell','2.0')[0]
Windows
第二个表达式使用括号,以便先强制执行强制转换运算,然后再执行索引选择。因此,整个数组将强制转换为(一个)字符串。然后,索引运算符选中字符串数组中的第一项,该项是第一个字符。
C:\PS> ([string]@('Windows','PowerShell','2.0'))[0]
W
在下面的示例中,由于 -gt(大于)运算符的优先级高于 -and(逻辑 AND) 运算符,因此表达式的结果为 FALSE。
C:\PS> 2 -gt 4 -and 1
False
它等效于以下表达式。
C:\PS> (2 -gt 4) -and 1
False
如果 -and 运算符的优先级较高,答案将是 TRUE。
C:\PS> 2 -gt (4 -and 1)
True
但是,此示例演示了管理运算符优先级的一个重要原则。当用户难以理解某个表达式时,请使用括号强制规定计算顺序,即使它强制规定了默认的运算符优先顺序。括号可使阅读和维护你的脚本的用户清楚地理解你的意图。
另请参阅
about_Assignment_Operators
about_Comparison_Operators
about_Join
about_Logical_Operators
about_Operators
about_Redirection
about_Scopes
about_Split
about_Type_Operators