about_Operator_Precedence

Aggiornamento: maggio 2014

Si applica a: Windows PowerShell 2.0, Windows PowerShell 3.0, Windows PowerShell 4.0, Windows PowerShell 5.0

ARGOMENTO

about_Operator_Precedence

DESCRIZIONE BREVE

Questo argomento elenca gli operatori di Windows PowerShell in ordine di precedenza.

[Questo argomento è stato redatto con il contributo di Kirk Munro, un MVP di Windows PowerShell di Ottawa, Ontario]

DESCRIZIONE LUNGA

Gli operatori di Windows PowerShell consentono di costruire espressioni semplici ma potenti. In questo argomento vengono elencati gli operatori in ordine di precedenza. Con ordine di precedenza si l'ordine in cui Windows PowerShell valuta gli operatori, nel caso in cui più operatori vengono visualizzati nella stessa espressione.

Quando gli operatori hanno la medesima precedenza, Windows PowerShell esegue una valutazione da sinistra a destra. Gli operatori di assegnazione, gli operatori di cast e gli operatori di negazione (!, -not, -bnot) rappresentano le uniche eccezioni poiché vengono valutati da destra a sinistra.

È possibile usare simboli quali le parentesi, per ignorare l'ordine di precedenza standard e forzare Windows PowerShell affinché valuti la parte chiusa di un'espressione.

Nell'elenco seguente, gli operatori vengono elencati nell'ordine di valutazione. Gli operatori della stessa riga o dello stesso gruppo hanno la stessa precedenza.

La colonna Operator elenca gli operatori. La colonna Reference elenca l'argomento della Guida di Windows PowerShell in cui viene descritto l'operatore. Per visualizzare l'argomento, digitare "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

Il gruppo di operatori seguente ha uguale precedenza. Le varianti che distinguono tra maiuscole e minuscole e quelle che lo fanno in modo esplicito hanno la stessa precedenza.

    -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

L'elenco viene ripreso qui con gli operatori nell'ordine di precedenza:

    -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

ESEMPI

I due comandi seguenti mostrano gli operatori aritmetici e le conseguenze relative all'uso di parentesi per forzare Windows PowerShell a valutare innanzitutto la parte dell'espressione racchiusa.

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

Nell'esempio seguente vengono recuperati i file di testo di sola lettura dalla directory locale e vengono salvati nella variabile $read_only.

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

Ciò equivale a quanto riportato nell'esempio seguente.

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

Dal momento che l'operatore pipeline (|) ha una precedenza più alta rispetto all'operatore di assegnazione (=), i file che il cmdlet Get-ChildItem ottiene vengono inviati al cmdlet Where-Object per eseguire un filtro prima che siano assegnati alla variabile $read_only.

Nell'esempio seguente viene illustrato come l'operatore di indice abbia la precedenza sull'operatore di cast. La prima espressione crea una matrice di tre stringhe. In seguito, usa l'operatore di indice con un valore pari a 0 per selezionare il primo oggetto nella matrice, vale a dire la prima stringa. Infine, viene eseguito il cast dell'oggetto selezionato come stringa. In questo caso, il cast non ha effetto.

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

La seconda espressione usa le parentesi per fare in modo che l'operazione di cast si verifichi prima della selezione dell'indice. Di conseguenza, eseguito il cast dell'intera matrice (singola) come stringa. Quindi, l'operatore di indice seleziona il primo elemento nella matrice di stringhe, vale a dire il primo carattere.

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

Dal momento che nell'esempio seguente l'operatore - gt (maggiore di) ha una precedenza superiore rispetto all'operatore -and (AND logico), il risultato dell'espressione è FALSE.

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

Ciò equivale a quanto riportato nell'espressione seguente.

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

Se l'operatore -and ha una precedenza superiore, la risposta sarà TRUE.

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

Tuttavia, questo esempio dimostra un principio importante relativo alla gestione della precedenza degli operatori. Quando gli utenti hanno difficoltà a interpretare un'espressione, usare le parentesi per forzare l'ordine di valutazione, anche se forza la precedenza dell'operatore predefinita. Le parentesi chiariscono gli script e la loro gestione a chi se ne occupa.

VEDERE ANCHE

about_Assignment_Operators

about_Comparison_Operators

about_Join

about_Logical_Operators

about_Operators

about_Redirection

about_Scopes

about_Split

about_Type_Operators