編輯附註
重要
Windows PowerShell 語言規格 3.0 於 2012 年 12 月發行,並以 Windows PowerShell 3.0 為基礎。 此規格不會反映 PowerShell 的目前狀態。 沒有計劃更新此檔以反映目前的狀態。 此文件在此提供作為歷史參考。
規格文件可作為 Microsoft Word 文件從 Microsoft 下載中心取得:https://www.microsoft.com/download/details.aspx?id=36389。該 Word 文件已在 Microsoft Learn 上轉換以供呈現。 在轉換期間,已進行一些編輯變更,以配合 Docs 平臺的格式設定。 已修正某些錯字和次要錯誤。
當某個類型的值用於要求不同類型的情境時,就會執行 類型轉換。 如果這類轉換自動發生,則稱為 隱含轉換。 (常見的範例是,有些運算子需要轉換其運算元所指定的一個或多個值。)允許隱含轉換,前提是保留來源值的意義,例如在轉換數字時不會遺失數字的精度。
轉換運算子(§7.2.9)允許明確的轉換。
以下將討論轉換,並在§6.19中每個運算子的描述視需要提供補充資訊。
將值明確轉換為其已經具有的型別不會對該值或其表示造成任何改變。
當表示式的值要綁定到參數時,處理轉換的規則涵蓋在 §6.17。
6.1 轉換成「void」
任何型別的值都可以藉由將其轉換成 void 類型來明確捨棄。 沒有結果。
6.2 轉換為bool
將任何值轉換成 bool 類型的規則如下:
- 零的數值或字元值會轉換成 False;非零的數值或字元值會轉換成 True。
- Null 類型的值會轉換成 False。
- 長度為 0 的字串會轉換成 False;長度為 > 0 的字串會轉換成 True。
- 具有值
$true的 switch 參數會轉換成 True,且具有值$false的參數會轉換成 False。 - 所有其他非 Null 參考類型值都會轉換成 True。
如果類型實作 IList:
- 如果物件的 Length > 2,則值會轉換成 True。
- 如果物件的 Length 為 1,且第一個元素本身不是 IList,則如果該元素的值為 true,則將轉換為 True。
- 否則,如果第一個元素的 Count >= 1,則值會變為 True。
- 否則,值會轉換成 False。
6.3 轉換成 char
將任何值轉換成 char 型態的規則如下:
- bool、decimal、float 或 double 類型的值轉換發生錯誤。
- Null 類型的值會轉換成 null (U+0000) 字元。
- 整數類型值,其值可以在類型 char 中表示,其值具有該值;否則,轉換發生錯誤。
- 字串值長度超過 1 的轉換發生錯誤。
- 長度為 1 的字串值會轉換成具有該字元值的字元。
- 數值型別的數值,在捨棄任何小數部分後,如果可以在目標型別中表示,則取該四捨五入後的值,否則轉換會出錯。
- 對於其他參考型別值,如果參考型別支援這類轉換,則會使用該轉換;否則,轉換發生錯誤。
6.4 轉換為整數
將任何值轉換成位元組、int 或 long 類型的規則如下:
- Bool 值 False 會轉換成零;bool 值 True 會轉換成 1。
- 如果字元類型的值可以在目標類型中表示,它就有該值;否則,轉換會發生錯誤。
- 數值型別的數值,在捨棄任何小數部分後,如果可以在目標型別中表示,則取該四捨五入後的值,否則轉換會出錯。
- Null 類型的值會轉換成零。
- 表示數字的字串會如 §6.16中所述進行轉換。 如果在截斷小數部分之後,結果可以在目標類型中表示,那麼這個字串格式良好且具有目標類型;否則,轉換將出錯。 如果字串不代表數字,轉換就會發生錯誤。
- 對於其他參考型別值,如果參考型別支援這類轉換,則會使用該轉換;否則,轉換發生錯誤。
6.5 轉換成 float 和 double
將任何值轉換成 float 或 double 類型的規則如下:
- Bool 值 False 會轉換成零;bool 值 True 會轉換成 1。
- 字元值被精確地表示。
- 如果可能的話,數值型別值會被精確表達;然而,對於 int、long 和 decimal 轉換為 float,以及 long 和 decimal 轉換為 double,整數值的一些最小有效位可能會遺失。
- Null 類型的值會轉換成零。
- 表示數值的字串將按照 §6.16中所述進行轉換;否則,會出現轉換錯誤。
- 對於其他參考型別值,如果參考型別支援這類轉換,則會使用該轉換;否則,轉換發生錯誤。
6.6 轉換成十進位
將任何值轉換成 decimal 類型的規則如下:
- Bool 值 False 會轉換成零;bool 值 True 會轉換成 1。
- 字元類型的值精確地表示出來。
- 數值型別的值會精確呈現;不過,如果該值太大或太小而無法容納在目標類別中,轉換就會發生錯誤。
- Null 類型的值會轉換成零。
- 表示數值的字串將按照 §6.16中所述進行轉換;否則,會出現轉換錯誤。
- 對於其他參考型別值,如果參考型別支援這類轉換,則會使用該轉換;否則,轉換發生錯誤。
- 成功轉換結果的縮放比例,使得小數部分沒有尾端零。
6.7 轉換成物件
Null 型別 (4.1.2) 以外的任何類型值都可以轉換成類型物件。 值會保留其類型和表示法。
6.8 轉換成字串
將任何值轉換成類型字串的規則如下:
- 布爾值
$false會轉換成 「False」;布爾值$true轉換成 「True」。 - char 類型值會轉換成包含該字元的 1 個字元字串。
- 數值型別的值會轉換成具有相應數字字面值格式的字串。 不過,結果沒有前置或尾端空格、沒有前置加號、整數有基底 10,而且沒有類型後綴。 對於十進位轉換,會保留比例。 針對 -∞、+∞ 和 NaN 的值,產生的字串分別為 “-Infinity”、“Infinity” 和 “NaN”。
- Null 類型的值會轉換成空字串。
- 對於一維陣列,結果會是字串,包含該陣列中每個元素的值,從開始到結尾轉換成字串,並以當前的輸出欄位分隔符(§2.3.2.2)分隔元素。 對於具有本身為陣列元素的陣列,只會轉換最上層元素。 使用來表示作為陣列元素的值的字串由實作決定。 對於多維度陣列,它會扁平化 (\9.12),然後視為 1 維陣列。
- Null 類型的值會轉換成空字串。
- scriptblock 類型值會轉換成字串,其中包含該區塊的文字,而不使用分隔符 { 和 } 字元。
- 對於列舉型別值,結果是字串,其中包含以逗號分隔之該值中編碼的每個列舉常數名稱。
- 對於其他參考型別值,如果參考型別支援這類轉換,則會使用該轉換;否則,轉換發生錯誤。
用來表示陣列元素值的字串,其格式為 System.Type[]、System.Type[,]等等。 針對其他參考型別,會呼叫ToString方法。 對於其他可列舉型別,來源值會視為 1 維陣列。
6.9 轉換成陣列
將任何值轉換成陣列型態的規則如下:
- 目標類型可能不是多維度陣列。
- Null 類型的值會保留原樣。
- 對於
$null以外的純量值或哈希表類型的值,會建立新的 1 元素陣列,其值在轉換成目標元素類型之後是純量。 - 針對一維陣列值,會建立新的目標類型陣列,並將每個元素從來源陣列轉換並複製到目標陣列中的對應元素。
- 對於多維度陣列值,該陣列會先被扁平化(§9.12),然後視為一維陣列值。
- 字串值會轉換成字元數位,其長度相同,且字串中連續字元佔用陣列中對應的位置。
對於其他可列舉型別,如果存在這類轉換,則會建立新的 1 元素陣列,其值為轉換為目標元素類型後的對應元素。 否則,轉換發生錯誤。
6.10 轉換成 xml
物件會轉換成類型字串,然後轉換成類型為 xml的 XML Document 物件。
6.11 轉換成正則表達式
指定字串型別值的運算式,可以轉換成類型 regex。
6.12 轉換成指令區塊 (scriptblock)
將任何值轉換成類型 scriptblock 的規則如下:
- 字串值會被視為命令名稱,並可以選擇性地接上該命令呼叫的參數。
6.13 轉換成列舉型別
將任何值轉換成列舉型別的規則如下:
- 字串類型的值,其中包含列舉型別的其中一個具名值(如有案例),會轉換成該具名值。
- 字串類型的值,其中包含區分大小寫的具名值逗號分隔清單(針對列舉型別),會轉換成所有這些具名值的位元OR運算結果。
6.14 轉換成其他參考類型
將任何值轉換成陣列型態或字串以外的參考型別的規則如下:
- Null 類型的值會保留原樣。
- 否則,行為是由實作決定的。
在此情境中會用到一些機制,包括單一參數建構函式或預設建構函式的可能使用(如果值是哈希表)、隱式和顯式轉換運算子、針對目標類型的 Parse 方法、Convert.ConvertTo 的使用及 ETS 轉換機制。
6.15 一般算術轉換
如果兩個操作數都未指定具有數值類型的值,則
- 如果左操作數指定 bool 類型的值,轉換就會發生錯誤。
- 否則,指定值
$null的所有操作數都會轉換成 int 類型的零,而且程式會繼續執行下列數值轉換。 - 否則,如果左操作數指定 char 類型的值,而右操作數指定 bool 類型的值,則轉換發生錯誤。
- 否則,如果左操作數指定字串類型的值,但不代表數位 (),則轉換發生錯誤。
- 否則,如果右操作數指定字串類型的值,但不代表數位 (),則轉換發生錯誤。
- 否則,指定字串類型值的所有操作數都會轉換成數位(6.16),程式會繼續執行下列數值轉換。
- 否則,轉換發生錯誤。
數值轉換:
- 如果一個操作數指定 decimal 類型的值,則其他操作數所指定的值會視需要轉換成該類型。 結果的類型為十進位。
- 否則,如果一個操作數指定 double 類型的值,則其他操作數所指定的值會視需要轉換成該類型。 結果的類型為 double。
- 否則,如果一個操作數指定 float 類型的值,則兩個操作數所指定的值會視需要轉換成 double 類型。 結果的類型為 double。
- 否則,如果一個操作數指定long類型的值,則其他操作數值所指定的值會視需要轉換為該類型。 結果的類型是序列中第一個能夠表示其值的數據類型,可能是 long 或 double。
- 否則,兩個操作數所指定的值會視需要轉換成 int 類型。 序列中能不截斷代表數值的第一個資料類型是 int、long 或 double。
6.16 從字串轉換成數值類型
視其內容而定,字串可以明確或隱含地轉換成數值。 具體說來
- 空字串會轉換成零值。
- 會忽略前置和尾端空格;不過,字串不一定只包含空格。
- 只包含空格符和/或行終止符的字串會轉換成值零。
- 允許一個前置 + 或 - 符號。
- 整數可能有十六進位前置詞(0x 或 0X)。
- 允許可選擇有正負號的指數。
- 不允許類型後綴和乘數。
- 區分大小寫的字串 “-Infinity”、“Infinity” 和 “NaN” 會被辨識為數值 -∞、+∞ 和 NaN。
6.17 參數係結期間的轉換
如需參數繫結的相關信息,請參閱 §8.14。
當表達式的值系結至參數時,會有額外的轉換考慮,如下所述:
- 如果參數類型為 switch (\4.2.5,\8.10.5),而且參數沒有自變數,則所呼叫命令中的參數值會設定為
$true。 如果參數類型不是 switch,則沒有自變數的參數發生錯誤。 - 如果參數類型為 switch,且自變數值
$null,則參數值會設定為$false。 - 如果參數類型是物件或 與自變數的類型相同,則會傳遞自變數的值而不轉換。
- 如果參數類型不是物件或 scriptblock,則會評估具有 scriptblock 類型的自變數,並將其結果當做自變數的值傳遞。 (這稱為 延遲的腳本區塊繫結)。如果參數類型是物件或 scriptblock,則具有 scriptblock 類型的自變數會原樣傳遞。
- 如果參數類型是 T2 類型的集合,而且引數是 T1 類型的純量,那麼該純量會被轉換為包含一個元素的 T2 類型集合。 如有必要,純量值會使用本節的轉換規則轉換成類型 T2。
- 如果參數類型是物件以外的純量型別,而且自變數是集合,自變數就會發生錯誤。
- 如果預期的參數類型是T2類型的集合,而且自變數是T1類型的集合,自變數會轉換成類型 T2 的集合,其長度與自變數集合相同。 如有必要,引數集合元素的值會使用本節的轉換規則轉換成類型 T2。
- 如果上述步驟和本章稍早指定的轉換都不夠,則會套用 \6.18 中的規則。 如果失敗,參數係結就會失敗。
6.18 .NET 轉換
針對隱含轉換,會先嘗試PowerShell的內建轉換。 如果無法解析轉換,下列 .NET 自定義轉換器會依序從上到下嘗試。 如果找到轉換,但拋出異常,則表示轉換失敗。
PSTypeConverter:有兩種方式可將 PSTypeConverter 的實作與其目標類別產生關聯:透過類型組態檔「types.ps1xml」或將
System.ComponentModel.TypeConverterAttribute屬性應用到目標類別上。 如需詳細資訊,請參閱 PowerShell SDK 檔。TypeConverter:此 CLR 類型提供將值型別轉換成其他型別的統一方式,以及存取標準值和子屬性。 最常見的轉換器類型是將數據轉換為文字表示形式並從文字表示形式轉換回來的轉換器。 類別的類型轉換器會透過
System.ComponentModel.TypeConverterAttribute綁定到該類別。 除非覆寫這個屬性,否則繼承自這個類別的所有類別都會使用與基類相同的類型轉換器。 如需詳細資訊,請參閱 PowerShell SDK 和 Microsoft .NET Framework 檔。Parse 方法:如果來源類型是字串,而目的地類型具有稱為
Parse的方法,則會呼叫該方法來執行轉換。建構函式:如果目的類型具有一個建構函式,其接受一個來源類型的單一參數,則會呼叫該建構函式來執行轉換。
隱含轉換運算符:如果來源類型具有轉換成目的地類型的隱含轉換運算符,則會呼叫該運算符來執行轉換。
明確轉換運算符:如果來源類型具有轉換成目的地類型的明確轉換運算符,則會呼叫該運算符來執行轉換。 如果目的地類型具有從來源類型轉換的明確轉換運算符,則會呼叫該運算符來執行轉換。
IConvertable:呼叫
System.Convert.ChangeType來執行轉換。
6.19 轉換至已排序格式
將任何值轉換成已排序虛擬型別的規則如下:
- 如果值是哈希常值 (!•2.3.5.6),則結果是具有實作定義型別的物件,其行為類似哈希表,且索引鍵順序符合哈希常值中指定的順序。
- 否則,行為是由實作決定的。
只有哈希常值(§2.3.5.6)才能轉換成有序。 結果是 System.Collections.Specialized.OrderedDictionary的實例。
6.20 轉換成 pscustomobject
將任何值轉換成虛擬類型 pscustomobject 的規則如下:
- 哈希表類型的值會轉換成 PowerShell 物件。 哈希表中的每一個鍵都會變成具有對應值的 NoteProperty。
- 否則,行為是由實作決定的。
一律允許轉換,但不會變更值的型別。