共用方式為


about_Operators

簡短描述

描述 PowerShell 支援的運算子。

完整描述

運算子是可在命令或表達式中使用的語言專案。 PowerShell 支援數種類型的運算子,以協助您操作值。

算術運算子

使用算術運算子 (、 、 、 ) 來計算命令或表示式中的值。 使用這些運算符,您可以加入、減去、乘法或除法值,並計算除法運算的餘數(模數)。

加號運算符會串連專案。 乘法運算符會傳回每個元素的指定複本數目。 你可以在任何實作算術運算子的.NET類型上使用,例如:IntStringDateTimeHashtable,以及陣列。

位運算子 (、 、 ) 會操作值中的位元模式。

如需詳細資訊,請參閱 about_Arithmetic_Operators。

指派運算子

使用指派運算子 (、 、 ) 將值指派、變更或附加至變數。 您可以將算術運算符與指派結合,將算術運算的結果指派給變數。

如需詳細資訊,請參閱 about_Assignment_Operators。

比較運算子

使用比較運算子 (、 、 、 、 ) 來比較值和測試條件。 例如,您可以比較兩個字串值,以判斷它們是否相等。

比較運算子也包含尋找或取代文字模式的運算符。 (、 、 ) 運算子使用正規表示式,而 (、 ) 則使用和 等通配符。

內含項目比較運算符會判斷測試值是否出現在參考集 (、 、 ) 中。

類型比較運算子 (, ) 會判斷物件是否為指定的型別。

如需詳細資訊,請參閱 about_Comparison_Operators。

邏輯運算子

使用邏輯運算子 (、 、 、 ) 將條件語句連接到單一複雜條件。 例如,您可以使用邏輯 運算符來建立具有兩個不同條件的對象篩選。

如需詳細資訊,請參閱 about_Logical_Operators。

重新導向運算子

使用重新導向運算子 (、 、 和 ) 將命令或表示式的輸出傳送至文字檔。 重新導向運算子的運作方式就像 Cmdlet (不含參數),但也可讓您將錯誤輸出重新導向至指定的檔案。 您也可以使用 Cmdlet 來重新導向輸出。

如需詳細資訊,請參閱 about_Redirection

分割和聯結運算子

和 運算子會分割和合併子字串。 運算符 會將字串分割成子字串。 運算符 會將多個字串串連成單一字串。

如需詳細資訊,請參閱 about_Split 和 about_Join。

類型運算子

使用類型運算子(-is-isnot-as)來尋找或更改物件的.NET型。

如需詳細資訊,請參閱 about_Type_Operators。

一元運算子

使用一元 和 運算符來遞增或遞減值,並 用於否定。 例如,若要將 變數 從 遞增為 ,請輸入 。

如需詳細資訊,請參閱 about_Arithmetic_Operators。

特殊操作員

特殊運算符具有不符合任何其他運算符群組的特定使用案例。 例如,特殊運算符可讓您執行命令、變更值的數據類型,或從陣列擷取元素。

群組運算子

如同其他語言, 用來覆寫運算式中的運算元優先順序。 例如:

不過,在 PowerShell 中,還有其他行為。

群組結果表達式

可讓您讓 指令 的輸出參與運算式。 例如:

PS> (Get-Item *.txt).Count -gt 10
True

管線群組表達式

當用作管線的第一個區段時,將命令或運算式包裝在括弧中,一律會導致運算式結果的 列舉 。 如果括弧包裝 命令,則會在透過管線傳送結果之前,會在 記憶體中收集 所有輸出,以完成命令。

在管線之前將表達式分組也可確保後續的物件逐對象處理不會干擾命令用來產生其輸出的列舉。

群組指派語句

未分組的指派語句不會輸出值。 將賦值陳述式分組時,會 傳遞 指派變數的值,並可用於較大的運算式。 例如:

PS> ($var = 1 + 2)
3
PS> ($var = 1 + 2) -eq 3
True

將語句包裝在括弧中,會將它轉換成輸出 值的 表達式。

此行為適用於所有指派運算符,包括 、 等 複合運算符以及遞增 () 和遞減 () 運算符。 不過,遞增和遞減的作業順序取決於其位置。

PS> $i = 0
PS> (++$i) # prefix
1
PS> $i = 0
PS> ($i++) # postfix
0
PS> $i
1

在前置詞案例中,的值 會在輸出之前遞增。 在後置案例中, 的值 會在輸出之後遞增。

您也可以在條件語句的內容中使用這項技術,例如 語句。

if ($textFiles = Get-ChildItem *.txt) {
    $textFiles.Count
}

在這裡範例中,如果沒有相符的檔案, 則命令不會傳回任何專案,並將任何指派給 ,這會在布爾值內容中視為 。 如果將一或多個 FileInfo 物件指派給 ,條件會評估為 。 您可以使用 語句主體中的 值。

Note

雖然這項技術方便且簡潔,但可能會導致指派運算符 () 與等號比較運算符 () 之間的混淆。

Subexpression 運算符

傳回一或多個語句的結果。 針對單一結果,傳回 純量。 針對多個結果,傳回陣列。 當您想要在另一個運算式內使用表示式時,請使用此選項。 例如,若要在字串表示式中內嵌命令的結果。

PS> "Today is $(Get-Date)"
Today is 12/02/2019 13:15:20

PS> "Folder list: $((dir C:\ -Dir).Name -join ', ')"
Folder list: Program Files, Program Files (x86), Users, Windows

陣列子表達式運算子

傳回一或多個語句做為陣列的結果。 結果一律是 0 個或多個 物件的陣列。

PS> $list = @(Get-Process | Select-Object -First 10; Get-Service | Select-Object -First 10 )
PS> $list.GetType()

IsPublic IsSerial Name                                     BaseType
-------- -------- ----                                     --------
True     True     Object[]                                 System.Array

PS> $list.Count
20
PS> $list = @(Get-Service | Where-Object Status -EQ Starting )
PS> $list.GetType()

IsPublic IsSerial Name                                     BaseType
-------- -------- ----                                     --------
True     True     Object[]                                 System.Array

PS> $list.Count
0

哈希表常值語法

類似於數位子表示式,這個語法是用來宣告哈希表。 如需詳細資訊,請參閱 about_Hash_Tables。

呼叫運算子

執行指令、腳本或腳本區塊。 呼叫運算子,也稱為 呼叫運算子,讓你執行以變數形式儲存並以字串或腳本區塊表示的指令。 呼叫運算子會在子範圍中執行。 如需範圍的詳細資訊,請參閱 about_Scopes。 您可以使用這個來建置包含所需命令、參數和自變數的字串,然後叫用字串,就像是命令一樣。 您建立的字串必須遵循與您在命令行輸入的命令相同的剖析規則。 如需詳細資訊,請參閱 about_Parsing。

此範例會將命令儲存在字串中,並使用呼叫運算符執行。

PS> $c = "Get-ExecutionPolicy"
PS> $c
Get-ExecutionPolicy
PS> & $c
AllSigned

呼叫運算子不會剖析字串。 這表示當您使用呼叫運算符時,無法在字串中使用命令參數。

PS> $c = "Get-Service -Name Spooler"
PS> $c
Get-Service -Name Spooler
PS> & $c
& : The term 'Get-Service -Name Spooler' is not recognized as the name of a
cmdlet, function, script file, or operable program. Check the spelling of
the name, or if a path was included, verify that the path is correct and
try again.

Invoke-Expression Cmdlet 可以執行在使用呼叫運算子時造成剖析錯誤的程式碼。

PS> & "1+1"
&: The term '1+1' is not recognized as a name of a cmdlet, function, script
file, or executable program. Check the spelling of the name, or if a path was
included, verify that the path is correct and try again.

PS> Invoke-Expression "1+1"
2

您可以使用文稿的檔案名來執行文稿。 腳本檔案必須具有 可執行檔的擴展名。 路徑中具有空格的檔案必須以引號括住。 如果您嘗試執行引號路徑,PowerShell 會顯示引號字串的內容,而不是執行腳本。 呼叫運算子可讓您執行包含檔名的字串內容。

PS C:\Scripts> Get-ChildItem

    Directory: C:\Scripts


Mode                LastWriteTime         Length Name
----                -------------         ------ ----
-a----        8/28/2018   1:36 PM             58 script name with spaces.ps1

PS C:\Scripts> ".\script name with spaces.ps1"
.\script name with spaces.ps1
PS C:\Scripts> & ".\script name with spaces.ps1"
Hello World!

關於腳本區塊的更多資訊,請參見 about_Script_Blocks。

背景運算元

在 PowerShell 作業的背景中執行管線。 此運算子的作用類似於 Unix 控制項運算子 ampersand (),它會在子Shell 中以異步方式在子Shell 中以作業方式執行命令。

此運算子的功能相當於 。 根據預設,背景運算符會啟動啟動平行工作的呼叫端目前工作目錄中的工作。 下列範例示範背景作業運算數的基本用法。

Get-Process -Name pwsh &

該命令的功能相當於 下列用法 :

Start-Job -ScriptBlock {Get-Process -Name pwsh}

就像 ,背景運算符會 傳 回物件。 此物件可以搭配 和 使用,就像您曾經用來啟動作業一樣。

$job = Get-Process -Name pwsh &
Receive-Job $job -Wait

 NPM(K)    PM(M)      WS(M)     CPU(s)      Id  SI ProcessName
 ------    -----      -----     ------      --  -- -----------
      0     0.00     221.16      25.90    6988 988 pwsh
      0     0.00     140.12      29.87   14845 845 pwsh
      0     0.00      85.51       0.91   19639 988 pwsh

Remove-Job $job

背景運算符也是語句終止符,就像 Unix 控制運算符 ampersand ()。 這可讓您在背景運算符之後 叫用其他命令。 下列範例示範在背景運算符之後 叫用其他命令。

$job = Get-Process -Name pwsh & Receive-Job $job -Wait

 NPM(K)    PM(M)      WS(M)     CPU(s)      Id  SI ProcessName
 ------    -----      -----     ------      --  -- -----------
      0     0.00     221.16      25.90    6988 988 pwsh
      0     0.00     140.12      29.87   14845 845 pwsh
      0     0.00      85.51       0.91   19639 988 pwsh

這相當於下列腳本:

$job = Start-Job -ScriptBlock {Get-Process -Name pwsh}
Receive-Job $job -Wait

如果您想要執行多個命令,每個命令都會在自己的背景進程中,但全部放在一行,只要在每個命令之間和之後放置 。

Get-Process -Name pwsh & Get-Service -Name BITS & Get-CimInstance -ClassName Win32_ComputerSystem &

如需 PowerShell 作業的詳細資訊,請參閱 about_Jobs。

轉換運算元

將物件轉換成或限制指定的型別。 如果無法轉換物件,PowerShell 會產生錯誤。

[datetime] '2/20/88' - [datetime] '1/20/88' -eq [timespan] '31'

當使用 轉換表示法指派變數時,也可以執行轉換。

逗號運算子

做為二進位運算符,逗號會建立陣列或附加至所建立的陣列。 在表達式模式中,以一元運算符的形式,逗號只會建立一個成員的陣列。 將逗號放在成員前面。

$myArray = 1,2,3
$SingleArray = ,1
Write-Output (,1)

因為 需要自變數,因此您必須將表達式放在括弧中。

點來源運算子

在目前範圍中執行腳本,讓腳本建立的任何函式、別名和變數都會新增至目前的範圍,並覆寫現有的函式。 腳本所宣告的參數會變成變數。 未指定任何值的參數會變成沒有值的變數。 不過,會保留自動變數 。

. C:\scripts\sample.ps1 1 2 -Also:3

Note

點來源運算子後面接著空格。 使用空格來區分點與代表目前目錄的點 () 符號。

在下列範例中,目前目錄中的Sample.ps1腳本會在目前範圍中執行。

. .\sample.ps1

Format 運算符

提供 .NET 複合格式化功能。 複合格式字串是由與索引預留位置混合的固定文字組成,稱為 格式項目。 這些格式項目會對應至清單中的物件。

每個格式項目都會使用下列格式,並由下列元件所組成:

{index[,alignment][:formatString]}

成對的大括號 ( 和 ) 是必要的。

格式作業產生的結果字串是由原始固定文字所組成,這些固定文字混合了清單中代表物件的字串。 如需詳細資訊,請參閱 複合格式設定。

在運算子左邊輸入複合格式字串,以及要格式化在運算元右邊的物件。

"{0} {1,-10} {2:N}" -f 1,"hello",[Math]::PI
1 hello      3.14

您可以使用 「0」 自訂規範來將數值零位。 後面的 零數表示要填補格式化字串的最大寬度。

"{0:00} {1:000} {2:000000}" -f 7, 24, 365
07 024 000365

如果您需要將大括號 () 保留在格式化字串中,您可以藉由將大括弧加倍來逸出它們。

"{0} vs. {{0}}" -f 'foo'
foo vs. {0}

索引運算子

從索引集合中選取物件,例如數位和哈希表。 陣列索引是以零起始,因此第一個物件會編製索引為 。 您也可以使用負數索引來取得最後一個值。 哈希表會依索引鍵值編製索引。

指定索引清單時,索引運算符會傳回對應至這些索引的成員清單。

PS> $a = 1, 2, 3
PS> $a[0]
1
PS> $a[-1]
3
PS> $a[2, 1, 0]
3
2
1
(Get-HotFix | Sort-Object InstalledOn)[-1]
$h = @{key="value"; name="PowerShell"; version="2.0"}
$h["name"]
PowerShell
$x = [xml]"<doc><intro>Once upon a time...</intro></doc>"
$x["doc"]
intro
-----
Once upon a time...

當物件不是索引集合時,使用索引運算符存取第一個項目會傳回物件本身。 超出第一個專案的索引值會傳回 。

PS> (2)[0]
2
PS> (2)[-1]
2
PS> (2)[1] -eq $null
True
PS> (2)[0,0] -eq $null
True

管線運算子

將前面命令的輸出傳送至後面命令的輸出。 當輸出包含多個物件(「集合」時,管線運算符會一次傳送一個物件。

Get-Process | Get-Member
Get-Service | Where-Object {$_.StartType -eq 'Automatic'}

管線鏈結運算子 和

根據左側管線的成功,有條件地執行右側管線。

# If Get-Process successfully finds a process called notepad,
# Stop-Process -Name notepad is called
Get-Process notepad && Stop-Process -Name notepad
# If npm install fails, the node_modules directory is removed
npm install || Remove-Item -Recurse ./node_modules

如需詳細資訊,請參閱 About_Pipeline_Chain_Operators。

範圍運算子

範圍運算子可用來表示循序整數或字元的陣列。 範圍運算子所聯結的值會定義範圍的開始和結束值。

Note

PowerShell 6 已新增字元範圍支援。

數字範圍

1..10
$max = 10
foreach ($a in 1..$max) {Write-Host $a}

您也可以以反向順序建立範圍。

10..1
5..-5 | ForEach-Object {Write-Output $_}

範圍的開始和結束值可以是任何評估為整數或字元的表達式組。 範圍的端點必須可轉換成帶正負號的32位整數 ()。 較大的值會造成錯誤。 此外,如果在數位中擷取範圍,產生的陣列大小會限製為 。 這是 .NET 中陣列的最大大小。

例如,您可以使用列舉的成員作為開始和結束值。

PS> enum Food {
      Apple
      Banana = 3
      Kiwi = 10
    }
PS> [Food]::Apple..[Food]::Kiwi
0
1
2
3
4
5
6
7
8
9
10

Important

產生的範圍不限於 列舉的值。 相反地,它代表所提供兩個值之間的值範圍。 您無法使用範圍運算子可靠地表示列舉的成員。

字元範圍

若要建立字元範圍,請以引號括住字元。

PS> 'a'..'f'
a
b
c
d
e
f
PS> 'F'..'A'
F
E
D
C
B
A

如果您將字元範圍指派給字串,則會將字元陣列指派給字串的相同。

PS> [string]$s = 'a'..'e'
$s
a b c d e
$a = 'a', 'b', 'c', 'd', 'e'
$a
a b c d e

陣列中的字元會聯結至字串。 字元會以喜好設定變數的值 分隔。 如需詳細資訊,請參閱 about_Preference_Variables。

陣列中的字元順序取決於字元的 ASCII 值。 例如,和 的 ASCII 值分別為 99 和 88。 該範圍會以反向順序呈現。

PS> 'c'..'X'
c
b
a
`
_
^
]
\
[
Z
Y
X

成員存取運算子

存取 物件的屬性和方法。 成員名稱可能是表達式。

$myProcess.PeakWorkingSet
(Get-Process powershell).Kill()
'OS', 'Platform' | ForEach-Object { $PSVersionTable. $_ }

從 PowerShell 3.0 開始,當您在沒有成員的清單集合物件上使用 運算符時,PowerShell 會自動列舉該集合中的專案,並在每個集合上使用 運算符。 如需詳細資訊,請參閱 about_Member-Access_Enumeration。

當你使用 member-access 運算子讀取不存在的屬性,或屬性收集方法拋出異常時,PowerShell 會回傳 而非丟出錯誤。 這種行為是針對物業進入的特有行為。 此行為遵循加州規則<.NET c0>CA1065規定:

屬性基本上是智慧型手機欄位。 因此,它們的行為應該盡可能像欄位一樣。 欄位不會擲回例外狀況,而且兩者都不應該有屬性。 如果您有擲回例外狀況的屬性,請考慮將它設為方法。

方法調用拋出的例外(包括直接呼叫底層 方法)不會被抑制。

靜態成員運算符

呼叫 .NET 類別的靜態屬性與方法。 若要尋找對象的靜態屬性和方法,請使用 Cmdlet 的 Static 參數。 成員名稱可能是表達式。

[datetime]::Now
'MinValue', 'MaxValue' | ForEach-Object { [int]:: $_ }

三元運算子

您可以在簡單的條件式案例中使用三元運算子來取代 語句。

如需詳細資訊,請參閱 about_If。

Null 聯合運算符

Null 聯合運算符 會傳回其左側操作數的值,如果不是 Null,則傳回其值。 否則,它會評估右側操作數,並傳回其結果。 如果左方運算元評估為非 Null, 運算子不會評估其右方運算元。

$x = $null
$x ?? 100
100

在下列範例中,將不會評估右側操作數。

[string] $todaysDate = '1/10/2020'
$todaysDate ?? (Get-Date).ToShortDateString()
1/10/2020

Null 聯合指派運算符

Null 聯合指派運算符 只有在左側操作數評估為 null 時,才會將右操作數的值指派給其左側操作數。 如果左方運算元評估為非 Null, 運算子不會評估其右方運算元。

$x = $null
$x ??= 100
$x
100

在下列範例中,將不會評估右側操作數。

[string] $todaysDate = '1/10/2020'
$todaysDate ??= (Get-Date).ToShortDateString()
$todaysDate
1/10/2020

Null 條件運算子 和

Note

此功能已從實驗性移至 PowerShell 7.1 中的主流。

Null 條件運算子只有在操作數評估為非 Null 時,才會將成員存取、 或專案存取 、 作業套用至其操作數,否則會傳回 null。

由於 PowerShell 允許 成為變數名稱的一部分,因此使用這些運算元需要變數名稱的正式規格。 您必須在變數名稱周圍使用大括弧 (),例如 或 當 是變數名稱的一部分時。

Note

的變數名稱語法 不應與 子表達式運算子混淆。 如需詳細資訊,請參閱 about_Variables 的變數名稱一節。

在下列範例中,會傳回 PropName 的值。

$a = @{ PropName = 100 }
${a}?.PropName
100

下列範例會傳回 Null,而不嘗試存取成員名稱 PropName。

$a = $null
${a}?.PropName

在此範例中,會傳回索引專案的值。

$a = 1..10
${a}?[0]
1

下列範例會傳回 null,而不嘗試存取索引專案。

$a = $null
${a}?[0]

另請參閱

  • about_Arithmetic_Operators
  • about_Assignment_Operators
  • about_Comparison_Operators
  • about_Logical_Operators
  • about_Operator_Precedence
  • about_Member-Access_Enumeration
  • about_Type_Operators
  • about_Split
  • about_Join
  • about_Redirection