about_Operators
簡短描述
描述 PowerShell 支援的運算子。
詳細描述
運算子是可在命令或表達式中使用的語言專案。 PowerShell 支援數種類型的運算子,以協助您操作值。
算術運算子
使用算術運算子 (+
、 、 -
*
、 /
%
) 來計算命令或表示式中的值。 使用這些運算符,您可以加入、減去、乘法或除法值,並計算除法運算的餘數(模數)。
加號運算符會串連專案。 乘法運算符會傳回每個元素的指定複本數目。 您可以在實作算術的任何 .NET 類型上使用算術運算符,例如: Int
、 String
、 DateTime
、 Hashtable
和陣列。
位運算子 (-band
、-bor
-bxor
-bnot
-shl
、 -shr
) 會操作值中的位元模式。
如需詳細資訊,請參閱 about_Arithmetic_Operators。
指派運算子
使用指派運算子 (=
、-=
*=
+=
/=
、 %=
) 將值指派、變更或附加至變數。 您可以將算術運算符與指派結合,將算術運算的結果指派給變數。
如需詳細資訊,請參閱 about_Assignment_Operators。
比較運算子
使用比較運算子 (-eq
、 、 -ne
、 -lt
-gt
、 -le
-ge
) 來比較值和測試條件。 例如,您可以比較兩個字串值,以判斷它們是否相等。
比較運算子也包含尋找或取代文字模式的運算符。 (-match
、 -notmatch
-replace
、 ) 運算子使用正規表示式,而 (-like
、 -notlike
) 則使用通配符 *
。
內含項目比較運算符會判斷測試值是否出現在參考集 (-in
、 、 -notin
) -contains
-notcontains
中。
類型比較運算子 (-is
, -isnot
) 會判斷物件是否為指定的型別。
如需詳細資訊,請參閱 about_Comparison_Operators。
邏輯運算子
使用邏輯運算子 (-and
、 、 -xor
-or
、 -not
!
) 將條件語句連接到單一複雜條件。 例如,您可以使用邏輯 -and
運算符來建立具有兩個不同條件的對象篩選。
如需詳細資訊,請參閱 about_Logical_Operators。
重新導向運算子
使用重新導向運算子 (>
、 、2>
2>>
>>
和 2>&1
) 將命令或表示式的輸出傳送至文字檔。 重新導向運算子的運作方式就像 Out-File
Cmdlet (不含參數),但也可讓您將錯誤輸出重新導向至指定的檔案。 您也可以使用 Tee-Object
Cmdlet 來重新導向輸出。
如需詳細資訊,請參閱 about_Redirection
分割和聯結運算符
-split
和 -join
運算子會分割和合併子字串。 運算符 -split
會將字串分割成子字串。 運算符 -join
會將多個字串串連成單一字串。
如需詳細資訊,請參閱 about_Split 和 about_Join。
類型運算元
使用類型運算子 (-is
、 、 -isnot
-as
) 來尋找或變更物件的 .NET 類型。
如需詳細資訊,請參閱 about_Type_Operators。
一元運算子
使用一元 ++
和 --
運算符來遞增或遞減值,並 -
用於否定。 例如,若要將 變數 $a
從 9
遞增為 10
,請輸入 $a++
。
如需詳細資訊,請參閱 about_Arithmetic_Operators。
特殊運算子
特殊運算符具有不符合任何其他運算符群組的特定使用案例。 例如,特殊運算符可讓您執行命令、變更值的數據類型,或從陣列擷取元素。
群組運算子 ( )
如同其他語言, (...)
用來覆寫運算式中的運算元優先順序。 例如:(1 + 2) / 3
不過,在 PowerShell 中,還有其他行為。
群組結果表達式
(...)
可讓您讓命令的輸出參與表達式。
例如:
PS> (Get-Item *.txt).Count -gt 10
True
注意
將命令包裝在括弧中會導致自動變數 $?
設定為 $true
,即使封閉的命令本身設定 $?
為 也一 $false
樣。
例如, (Get-Item /Nosuch); $?
意外地會產生 True。 如需 的詳細資訊 $?
,請參閱 about_Automatic_Variables。
管線群組表達式
當做管線的第一個區段使用時,將命令或表達式包裝在括弧中,不一定會造成 表達式結果的列舉 。 如果括弧包裝命令,則會在透過管線傳送結果之前,先執行以在記憶體中收集的所有輸出完成。
例如,這些語句的輸出不同:
PS> ConvertFrom-Json '["a", "b"]' | ForEach-Object { "The value is '$_'" }
The value is 'a b'
PS> (ConvertFrom-Json '["a", "b"]') | ForEach-Object { "The value is '$_'" }
The value is 'a'
The value is 'b'
在管線之前將表達式分組也可確保後續的物件逐對象處理不會干擾命令用來產生其輸出的列舉。
例如,將 輸出從 Get-ChildItem
管線傳送至 Rename-Item
可能會有非預期的效果,其中專案重新命名,然後再次探索並重新命名第二次。
群組指派語句
未分組的指派語句不會輸出值。 將指派語句分組時,會傳遞指派變數的值,並可用於較大的表達式中。 例如:
PS> ($var = 1 + 2)
3
PS> ($var = 1 + 2) -eq 3
True
將語句包裝在括弧中,會將它轉換成輸出 值的 $var
表達式。
此行為適用於所有指派運算符,包括 、 等 +=
複合運算符以及遞增 (++
) 和遞減 (--
) 運算符。
不過,遞增和遞減的作業順序取決於其位置。
PS> $i = 0
PS> (++$i) # prefix
1
PS> $i = 0
PS> ($i++) # postfix
0
PS> $i
1
在前置詞案例中,的值 $i
會在輸出之前遞增。 在後置案例中, 的值 $i
會在輸出之後遞增。
您也可以在條件語句的內容中使用這項技術,例如 if
語句。
if ($textFiles = Get-ChildItem *.txt) {
$textFiles.Count
}
在這裡範例中,如果沒有相符的檔案, Get-ChildItem
則命令不會傳回任何專案,並將任何指派給 $textFiles
,這會在布爾值內容中視為 $false
。 如果將一或多個 FileInfo 物件指派給 $textFiles
,則條件式會評估為 $true
。 您可以使用 語句主體if
中的 值$textFiles
。
注意
雖然這項技術方便且簡潔,但可能會導致指派運算符 () 與等號比較運算符 (=
-eq
) 之間的混淆。
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.
At line:1 char:2
+ & $c
+ ~~
+ CategoryInfo : ObjectNotFound: (Get-Service -Name Spooler:String) [], CommandNotFoundException
+ FullyQualifiedErrorId : CommandNotFoundException
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.
At line:1 char:2
+ & "1+1"
+ ~~~~~
+ CategoryInfo : ObjectNotFound: (1+1:String) [], CommandNotFoundException
+ FullyQualifiedErrorId : CommandNotFoundException
PS> Invoke-Expression "1+1"
2
您可以使用文稿的檔案名來執行文稿。 腳本檔案必須具有 .ps1
可執行檔的擴展名。 路徑中具有空格的檔案必須以引號括住。 如果您嘗試執行引號路徑,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 會產生錯誤。
[DateTime] '2/20/88' - [DateTime] '1/20/88' -eq [TimeSpan] '31'
當變數指派給使用 轉換表示法時,也可以執行轉換。
逗號運算子 ,
做為二進位運算符,逗號會建立陣列或附加至所建立的陣列。 在表達式模式中,以一元運算符的形式,逗號只會建立一個成員的陣列。 將逗號放在成員前面。
$myArray = 1,2,3
$SingleArray = ,1
Write-Output (,1)
因為 Write-Output
需要自變數,因此您必須將表達式放在括弧中。
點來源運算子 .
在目前範圍中執行腳本,讓腳本建立的任何函式、別名和變數都會新增至目前的範圍,並覆寫現有的函式。 腳本所宣告的參數會變成變數。 未指定任何值的參數會變成沒有值的變數。 不過,會保留自動變數 $args
。
. c:\scripts\sample.ps1 1 2 -Also:3
注意
點來源運算子後面接著空格。 使用空格來區分點與代表目前目錄的點 (.
) 符號。
在下列範例中,目前目錄中的Sample.ps1腳本會在目前範圍中執行。
. .\sample.ps1
Format 運算符 -f
提供 .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}
索引運算子 [ ]
從索引集合中選取物件,例如數位和哈希表。 陣列索引是以零起始,因此第一個物件會編製索引為 [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...
當物件不是索引集合時,使用索引運算符存取第一個項目會傳回物件本身。 超出第一個專案的索引值會傳回 $null
。
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'}
範圍運算子 ..
範圍運算子可用來表示循序整數的陣列。 範圍運算子所聯結的值會定義範圍的開始和結束值。
1..10
$max = 10
foreach ($a in 1..$max) {Write-Host $a}
您也可以以反向順序建立範圍。
10..1
5..-5 | ForEach-Object {Write-Output $_}
範圍的開始和結束值可以是任何評估為整數或字元的表達式組。 範圍的端點必須可轉換成帶正負號的32位整數 ([int32]
)。 較大的值會造成錯誤。 此外,如果在陣列中擷取範圍,產生的陣列大小會限製為 268435448
(或 256mb - 8
)。 這是 .NET Framework 中陣列的大小上限。
例如,您可以使用列舉的成員作為開始和結束值。
PS> enum Food {
Apple
Banana = 3
Kiwi = 10
}
PS> [Food]::Apple..[Food]::Kiwi
0
1
2
3
4
5
6
7
8
9
10
重要
產生的範圍不限於 列舉的值。 相反地,它代表所提供兩個值之間的值範圍。 您無法使用範圍運算子可靠地表示列舉的成員。
成員存取運算子 .
存取 物件的屬性和方法。 成員名稱可能是表達式。
$myProcess.peakWorkingSet
(Get-Process PowerShell).kill()
'OS', 'Platform' | Foreach-Object { $PSVersionTable. $_ }
從 PowerShell 3.0 開始,當您在沒有成員的清單集合物件上使用 運算符時,PowerShell 會自動列舉該集合中的專案,並在每個集合上使用 運算符。 如需詳細資訊,請參閱 about_Member-Access_Enumeration。
靜態成員運算符 ::
呼叫 .NET 類別的靜態屬性和方法。 若要尋找對象的靜態屬性和方法,請使用 Cmdlet 的 Get-Member
Static 參數。 成員名稱可能是表達式。
[datetime]::Now
'MinValue', 'MaxValue' | Foreach-Object { [int]:: $_ }