簡短描述
依優先順序列出 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 邏輯操作員優先順序不同。