編輯附註
重要
Windows PowerShell 語言規格 3.0 於 2012 年 12 月發行,並以 Windows PowerShell 3.0 為基礎。 此規格不會反映 PowerShell 的目前狀態。 沒有計劃更新此檔以反映目前的狀態。 歷史參考文件提供於此。
規格文件可從 Microsoft 下載中心以 Microsoft Word 文件格式取得:https://www.microsoft.com/download/details.aspx?id=36389 該 Word 文件已在 Microsoft Learn 上轉換以供展示。 在轉換期間,已進行一些編輯變更,以配合 Docs 平臺的格式設定。 已修正某些錯字和次要錯誤。
9.1 簡介
PowerShell 支援一或多個維度的陣列,且每個維度都有零或多個 元素。 在維度內,元素會以遞增的整數順序編號,從零開始。
任何個別元素都可以透過陣列下標運算子 []
存取(7.1.4)。 陣列的維度數稱為其 階。
元素可以包含任何類型的值,包括陣列型別。 具有一或多個元素的陣列,其值屬於任何陣列類型,稱為 鋸齒狀陣列。 多維度陣列 具有多個維度,在此情況下,維度中每個數據列的項目數目都相同。 不規則陣列的元素可能包含多維度陣列,而多維度陣列的元素也能包含不規則陣列。
多維陣列以列為主序存儲。 陣列中的元素數目被稱為該陣列的長度,並且在建立陣列時是固定的。 因此,可以使用表達式 來存取長度為 N 的 1 維陣列 A 中的元素(即 A[0], A[1], ..., A[N-1]
)。 二維陣列中的元素 B 具有 M 行,每一行有 N 列,可以使用運算式 B[0,0], B[0,1], ..., B[0,N-1], B[1,0], B[1,1], ..., B[1,N-1], ..., B[M-1,0], B[M-1,1], ..., B[M-1,N-1]
來存取。
以此類推,針對具有三個或多個維度的陣列。
根據預設,陣列 多型;亦即,其元素不需要全都有相同的類型。 例如
$items = 10,"blue",12.54e3,16.30D # 1-D array of length 4
$items[1] = -2.345
$items[2] = "green"
$a = New-Object 'object[,]' 2,2 # 2-D array of length 4
$a[0,0] = 10
$a[0,1] = $false
$a[1,0] = "red"
$a[1,1] = $null
一維陣列的類型為 type[]
、二維陣列的類型為 type[,]
、三維陣列的類型為 type[,,]
,依此類推,其中 類型 是不受限制類型陣列的物件,或限制陣列的限制類型(§9.4)。
所有陣列類型都是衍生自Array類型 (\4.3.2)。
9.2 陣列建立
陣列是透過 陣列建立表達式來建立,其格式如下:一元逗號運算子(§7.2.1)、陣列表達式(§7.1.7)、二元逗號運算子(§7.3)、範圍運算子(§7.4),或 New-Object cmdlet。
以下是陣列建立和使用方式的一些範例:
$values = 10, 20, 30
for ($i = 0; $i -lt $values.Length; ++$i) {
"`$values[$i] = $($values[$i])"
}
$x = , 10 # x refers to an array of length 1
$x = @(10) # x refers to an array of length 1
$x = @() # x refers to an array of length 0
$a = New-Object 'object[,]' 2, 2 # create a 2x2 array of anything
$a[0, 0] = 10 # set to an int value
$a[0, 1] = $false # set to a boolean value
$a[1, 0] = "red" # set to a string value
$a[1, 1] = 10.50D # set to a decimal value
foreach ($e in $a) { # enumerate over the whole array
$e
}
以下內容寫入管線:
$values[0] = 10
$values[1] = 20
$values[2] = 30
10
False
red
10.50
未明確初始化之任何元素的預設初始值是該專案類型的預設值(也就是,$false
、零或 $null
)。
9.3 陣列串連
任意類型和長度的陣列可以透過 +
和 +=
運算符串連,這兩者都會導致建立新的不受限制的 1 維陣列。 現有的陣列不會變更。 如需詳細資訊,請參閱 §7.7.3,至於新增至限制型別陣列的討論,請參閱 §9.4。
9.4 限制項目類型
您可以建立一維陣列,透過在陣列建立運算式前加上陣列型別轉換來限制其類型。 例如
$a = [int[]](1,2,3,4) # constrained to int
$a[1] = "abc" # implementation-defined behavior
$a += 1.23 # new array is unconstrained
建立多維度陣列的語法需要類型的規格,而且該類型會成為該陣列的條件約束類型。 不過,透過指定類型 object[]
,實際上確實沒有任何限制,因為任何類型的值都可以被指派給該類型陣列的元素。
連接兩個陣列(第7.7.3節)時,將總是產生一個新的不受限制的陣列,即便這兩個陣列受同一類型限制也是如此。 例如
$a = [int[]](1,2,3) # constrained to int
$b = [int[]](10,20) # constrained to int
$c = $a + $b # constraint not preserved
$c = [int[]]($a + $b) # result explicitly constrained to int
9.5 陣列作為參考型別
由於陣列類型是參考型別,因此指定陣列的變數可以參考任何維度、長度和元素類型的任何陣列。 例如
$a = 10,20 # $a refers to an array of length 2
$a = 10,20,30 # $a refers to a different array, of length 3
$a = "red",10.6 # $a refers to a different array, of length 2
$a = New-Object 'int[,]' 2,3 # $a refers to an array of rank 2
陣列的指派涉及淺層拷貝;也就是說,指派的變數會參考相同的陣列,不會建立陣列的複本。 例如
$a = 10,20,30
">$a<"
$b = $a # make $b refer to the same array as $a
">$b<"
$a[0] = 6 # change value of [0] via $a
">$a<"
">$b<" # change is reflected in $b
$b += 40 # make $b refer to a new array
$a[0] = 8 # change value of [0] via $a
">$a<"
">$b<" # change is not reflected in $b
以下內容寫入管線:
>10 20 30<
>10 20 30<
>6 20 30<
>6 20 30<
>8 20 30<
>6 20 30 40<
9.6 陣列作為陣列元素
陣列的任何元素本身都可以是陣列。 例如
$colors = "red", "blue", "green"
$list = $colors, (,7), (1.2, "yes") # parens in (,7) are redundant; they
# are intended to aid readability
"`$list refers to an array of length $($list.Length)"
">$($list[1][0])<"
">$($list[2][1])<"
以下內容寫入管線:
$list refers to an array of length 3
>7<
>yes<
$list[1]
是指 1 個元素的陣列,整數 7,可透過 $list[1][0]
存取,如下所示。 將此與下列稍有不同的情境進行比較:
$list = $colors, 7, (1.2, "yes") # 7 has no prefix comma
">$($list[1])<"
在這裡,$list[1]
是指透過 $list[1]
存取的純量整數 7。
請考慮下列範例:
$x = [string[]]("red","green")
$y = 12.5, $true, "blue"
$a = New-Object 'object[,]' 2,2
$a[0,0] = $x # element is an array of 2 strings
$a[0,1] = 20 # element is an int
$a[1,0] = $y # element is an array of 3 objects
$a[1,1] = [int[]](92,93) # element is an array of 2 ints
9.7 負註標
這在 §7.1.4.1中討論。
9.8 界限檢查
這在 §7.1.4.1中討論。
9.9 陣列切片
陣列配量 是不受限制的 1 維陣列,其元素是集合中零個或多個項目的複本。 陣列切片是透過下標運算子建立 []
(§7.1.4.5)。
9.10 複製陣列
您可以使用方法 [array]::Copy
,將一組連續的元素從一個陣列複製到另一個陣列。 例如
$a = [int[]](10,20,30)
$b = [int[]](0,1,2,3,4,5)
[array]::Copy($a, $b, 2) # $a[0]->$b[0],
$a[1]->$b[1]
[array]::Copy($a, 1, $b, 3, 2) # $a[1]->$b[3],
$a[2]->$b[4]
9.11 遍歷陣列
雖然可以透過下標運算符一個個地訪問陣列的元素,但我們可以使用 foreach 語句來列舉陣列的元素。 對於多維度陣列,元素會依數據列主要順序進行處理。 例如
$a = 10, 53, 16, -43
foreach ($elem in $a) {
# do something with element via $elem
}
foreach ($elem in -5..5) {
# do something with element via $elem
}
$a = New-Object 'int[,]' 3, 2
foreach ($elem in $a) {
# do something with element via $elem
}
9.12 多維陣列扁平化
多維度陣列的一些操作(例如複寫(7.6.3)和串連(7.7.3))要求將該陣列進行扁平化;也就是說,要轉換成不受限制類型的一維陣列。 產生的陣列會依數據列主要順序接受所有元素。
請考慮下列範例:
$a = "red",$true
$b = (New-Object 'int[,]' 2,2)
$b[0,0] = 10
$b[0,1] = 20
$b[1,0] = 30
$b[1,1] = 40
$c = $a + $b
$c
指定的陣列包含 「red」 元素,$true
、10、20、30 和 40。