共用方式為


9. 陣列

編輯附註

重要

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。