關於運算子的優先順序

簡短描述

依優先順序列出 PowerShell 運算子。

完整描述

PowerShell 運算符可讓您建構簡單但功能強大的表達式。 本主題會依優先順序列出運算符。 優先順序是 PowerShell 在相同運算式中出現多個運算符時評估運算子的順序。

當運算符具有相等優先順序時,PowerShell 會在表達式中出現時,從左至右評估它們。 例外狀況是指派運算符、轉換運算符和否定運算符(!-not-bnot),由右至左評估。

您可以使用括號等符號來覆蓋標準優先順序,並強制PowerShell先評估表達式中的括號部分,再評估未用括號的部分。

在下列清單中,運算子會依評估的順序列出。 相同行或相同群組中的運算符具有相等的優先順序。

運算子欄會列出運算子。 [參考] 數據行會列出描述運算子的 PowerShell 說明主題。 若要互動式顯示主題,請使用 Get-Help -Name <topic-name>

算子 參考
$() @() () @{} 關於_運算子
. ?. (成員存取) 關於_運算子
:: (靜態) 關於_運算子
[0] ?[0] (索引運算子) 關於_運算子
[int] (轉型運算子) 關於_運算子
-split (一元) 關於拆分
-join (一元) 有關_加入
, (逗號運算子) 關於_運算子
++ -- about_Assignment_Operators
! -not 關於邏輯運算子
.. (範圍運算子) 關於_運算子
-f(格式運算子) 關於_運算子
- (一元/負數) 關於算術運算子
* / % 關於算術運算子
+ - 關於算術運算子

下列運算子群組的優先順序相等。 其區分大小寫與不區分大小寫的變體的優先順序相同。

算子 參考
-split (二進位) 關於拆分
-join (二進位) 有關_加入
-is -isnot -as about_Type_Operators
-eq -ne -gt -ge -lt -le 關於比較運算子
-like -notlike 關於比較運算子
-match -notmatch 關於比較運算子
-in -notIn 關於比較運算子
-contains -notcontains 關於比較運算子
-replace 關於比較運算子

這份清單在這裡按照以下運算子的優先順序繼續:

算子 參考
-band -bnot -bor -bxor -shr -shl 關於算術運算子
-and -or -xor 關於邏輯運算子

下列項目並不是實際的運算符。 它們是 PowerShell 命令語法的一部分,而不是表達式語法。 指派始終是最後發生的動作。

語法 參考
. (dot-source) 關於_運算子
& (通話) 關於_運算子
? <if-true> : <if-false> (三進位算符) 關於_運算子
?? (零聚合算符) 關於_運算子
| (管線運算) 關於_運算子
> >> 2> 2>> 2>&1 about_Redirection
&& ||(管線鏈運算子) 關於_運算子
= += -= *= /= %= ??= about_Assignment_Operators

範例

以下兩個範例展示了算術運算子以及使用括號強制 PowerShell 先評估表達式中包含部分的效果。

PS> 2 + 3 * 4
14

PS> (2 + 3) * 4
20

下列範例會從本機目錄取得唯讀文本檔,並將其儲存在 $readOnly 變數中。

$readOnly = Get-ChildItem -Path *.txt | Where-Object { $_.IsReadOnly }

它相當於下列範例。

$readOnly = (Get-ChildItem -Path *.txt | Where-Object { $_.IsReadOnly })

因為管線運算符 (|) 的優先順序高於指派運算符 (=),所以 Get-ChildItem Cmdlet 取得的檔案會在指派給 Where-Object 變數之前,先傳送至 $readOnly Cmdlet 進行篩選。

下列範例示範索引運算符的優先順序高於轉換運算符。

此表達式會建立三個字串的陣列。 接著,它使用值為 的 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 運算元優先權較高,結果為真。

PS> 2 -gt (4 -and 1)
True

不過,此範例示範管理運算符優先順序的重要原則。 當某個表達式讓人難以解釋時,請使用括號來強制評估順序,即使會覆蓋預設的運算子優先順序。 括弧會向閱讀和維護腳本的人員清楚說明您的意圖。

以下範例展示了與-or邏輯運算子之間的-and優先順序。

PS> $true -or $false -and $false
False

在其他語言如 C# 中,邏輯 AND 通常優先順序高於邏輯 OR,因此你可能會預期上述表達式會得到 TRUE。

然而, -and 在 PowerShell 中,與 -or 運算子的優先權是一樣的。 它們在表達式中出現時,從左到右進行評估。 當 $true -or $false 是 TRUE 和 $true -and $false 是 FALSE 時,該表達式的結果也是 FALSE。

這很重要

PowerShell 內的其他上下文,如 WMI 查詢語言(WQL) 和 Active Directory 過濾器,都有其操作先發順序,可能與 PowerShell 邏輯操作員優先順序不同。

另請參閱