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