about_Operator_Precedence

Se aplica a: Windows PowerShell 2.0, Windows PowerShell 3.0, Windows PowerShell 4.0, Windows PowerShell 5.0

TEMA

about_Operator_Precedence

DESCRIPCIÓN BREVE

Muestra los operadores de Windows PowerShell en orden de prioridad.

[Kirk Munro, MVP de Windows PowerShell de Ottawa (Ontario), aportó este tema].

DESCRIPCIÓN LARGA

Los operadores de Windows PowerShell permiten construir expresiones sencillas pero eficaces. En este tema se enumeran los operadores en orden de prioridad. El orden de prioridad es el orden en que Windows PowerShell evalúa los operadores cuando aparecen varios operadores en la misma expresión.

Cuando los operadores tienen la misma prioridad, Windows PowerShell los evalúa de izquierda a derecha. Las excepciones son los operadores de asignación, los operadores de conversión y los operadores de negación (!, -not y -bnot), que se evalúan de derecha a izquierda.

Se pueden usar los contenedores (como los paréntesis) para invalidar el orden de prioridad estándar y forzar a que Windows PowerShell evalúe la parte de una expresión que está entre paréntesis antes de una parte que no lo está.

En la siguiente lista se enumeran los operadores en el orden en que se evalúan. Los operadores en la misma línea o en el mismo grupo tienen la misma prioridad.

La columna Operador muestra los operadores. La columna Referencia muestra el tema de ayuda de Windows PowerShell en el que se describe el operador. Para mostrar el tema, escriba "get-help <nombre-tema>".

    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

El siguiente grupo de operadores tiene la misma prioridad. Las variantes que distinguen mayúsculas de minúsculas y las que no las distinguen de forma explícita tienen la misma prioridad.

    -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

La lista queda resumida aquí con los siguientes operadores en orden de prioridad:

    -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

EJEMPLOS

Los dos comandos siguientes muestran los operadores aritméticos y el efecto de usar paréntesis para forzar a que Windows PowerShell evalúe primero la parte de la expresión que está entre paréntesis.

        C:\PS> 2 + 3 * 4
        14
        
        C:\PS> (2 + 3) * 4
        20

El siguiente ejemplo obtiene los archivos de texto de solo lectura del directorio local y los guarda en la variable $read_only.

        $read_only = get-childitem *.txt | where-object {$_.isReadOnly}

Es equivalente al siguiente ejemplo.

        $read_only = ( get-childitem *.txt | where-object {$_.isReadOnly} )

Dado que el operador de canalización (|) tiene mayor prioridad que el operador de asignación (=), los archivos que obtiene el cmdlet Get-ChildItem se envían al cmdlet Where-Object para filtrarse antes de que se asignen a la variable $read_only.

En el siguiente ejemplo se muestra que el operador de índice tiene prioridad sobre el operador de conversión. La primera expresión crea una matriz de tres cadenas. A continuación, usa el operador de índice con un valor de 0 para seleccionar el primer objeto de la matriz, que es la primera cadena. Por último, convierte el objeto seleccionado en una cadena. En este caso, la conversión no tiene ningún efecto.

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

La segunda expresión usa los paréntesis para forzar que la operación de conversión se produzca antes de la selección del índice. Como resultado, se convierte la matriz en su conjunto en una cadena (única). A continuación, el operador de índice selecciona el primer elemento de la matriz de cadenas, que es el primer carácter.

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

En el siguiente ejemplo, el resultado de la expresión es FALSE porque el operador -gt (mayor que) tiene una prioridad mayor que el operador -and (AND lógico).

        C:\PS> 2 -gt 4 -and 1
        False 

Es equivalente a la siguiente expresión.

        C:\PS> (2 -gt 4) -and 1
        False 

Si el operador -and tuviera una mayor prioridad, la respuesta sería TRUE.

        C:\PS> 2 -gt (4 -and 1)
        True 

Sin embargo, este ejemplo demuestra un principio importante a la hora de administrar la prioridad de los operadores. Cuando una expresión resulte difícil de interpretar, use los paréntesis para forzar el orden de evaluación, aunque fuerce la prioridad del operador predeterminado. Los paréntesis facilitan la lectura a las personas que leen y mantienen sus scripts.

VEA TAMBIÉN

about_Assignment_Operators

about_Comparison_Operators

about_Join

about_Logical_Operators

about_Operators

about_Redirection

about_Scopes

about_Split

about_Type_Operators