Uwaga
Dostęp do tej strony wymaga autoryzacji. Może spróbować zalogować się lub zmienić katalogi.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
Notatka redakcyjna
Ważny
Specyfikacja języka Windows PowerShell 3.0
Dokument specyfikacji jest dostępny jako dokument programu Microsoft Word z Centrum pobierania Microsoft pod adresem: https://www.microsoft.com/download/details.aspx?id=36389 Dokument programu Word został przekonwertowany na prezentację tutaj w witrynie Microsoft Learn. Podczas konwersji wprowadzono pewne zmiany redakcyjne w celu dostosowania formatowania dla platformy Docs. Usunięto niektóre literówki i drobne błędy.
9.1 Wprowadzenie
Program PowerShell obsługuje tablice jedno- lub wielowymiarowe, gdzie każdy wymiar może mieć zero lub więcej elementów . W obrębie wymiaru elementy są numerowane w kolejności rosnącej liczby całkowitej rozpoczynającej się od zera.
Dostęp do dowolnego elementu można uzyskać za pośrednictwem operatora indeksowania tablicy []
(§7.1.4). Liczba wymiarów w tablicy nazywana jest jej stopniem.
Element może zawierać wartość dowolnego typu, w tym typ tablicy. Tablica mająca jeden lub więcej elementów, których wartości są dowolnego typu tablicy, nazywana jest tablicą ząbkowaną. Tablica wielowymiarowa ma wiele wymiarów, w tym przypadku liczba elementów w każdym wierszu wymiaru jest taka sama. Element tablicy postrzępionej może zawierać tablicę wielowymiarową i odwrotnie.
Tablice wielowymiarowe są przechowywane w porządku wierszowym. Liczba elementów w tablicy jest nazywana długością tablicy, która jest stała podczas tworzenia tablicy. W związku z tym elementy w jednowymiarowej tablicy A o długości N mogą być dostępne (tj. indeksowane) przy użyciu wyrażeń A[0], A[1], ..., A[N-1]
. Elementy w 2-wymiarowej tablicy B, posiadającej M wierszy, z których każdy ma N kolumn, można uzyskać, używając wyrażeń 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]
.
I tak dalej w przypadku tablic z co najmniej trzema wymiarami.
Domyślnie tablica jest polimorficzna; tj. jej elementy nie muszą mieć tego samego typu. Na przykład
$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
Tablica 1-wymiarowa ma typ type[]
, tablica 2-wymiarowa ma typ type[,]
, tablica 3-wymiarowa ma typ type[,,]
, i tak dalej. Gdzie typ jest obiektem dla tablicy typu nieograniczonego lub typ ograniczony dla tablicy ograniczonej (§9.4).
Wszystkie typy tablic pochodzą z typu Array (§4.3.2).
9.2 Tworzenie tablic
Tablica jest tworzona za pomocą wyrażenia tworzenia tablicy array creation expression, które ma następujące formy: jednoargumentowy operator przecinka (§7.2.1), wyrażenie-tablicy (§7.1.7), binarny operator przecinka (§7.3), operator zakresu (§7.4) lub polecenie cmdlet New-Object.
Oto kilka przykładów tworzenia i użycia tablic:
$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
}
Do potoku zostaje zapisane następujące:
$values[0] = 10
$values[1] = 20
$values[2] = 30
10
False
red
10.50
Domyślna wartość początkowa dowolnego elementu, który nie jest jawnie zainicjowany, jest wartością domyślną dla typu tego elementu (czyli $false
, zero lub $null
).
9.3 Łączenie tablic
Tablice dowolnego typu i długości mogą być łączone za pośrednictwem operatorów +
i +=
, z których oba powodują utworzenie nowej tablicy bez ograniczeń 1-wymiarowych. Istniejące tablice są niezmienione. Zobacz §7.7.3, aby uzyskać więcej informacji, oraz §9.4, aby zapoznać się z omówieniem dodawania do tablicy typów ograniczonych.
9.4 Typy elementów ograniczeń
Można utworzyć tablicę 1-wymiarową, aby była ograniczona typem, poprzez poprzedzenie wyrażenia tworzącego tablicę rzutowaniem typu tablicy. Na przykład
$a = [int[]](1,2,3,4) # constrained to int
$a[1] = "abc" # implementation-defined behavior
$a += 1.23 # new array is unconstrained
Składnia tworzenia tablicy wielowymiarowej wymaga specyfikacji typu, a ten typ staje się typem ograniczenia dla tej tablicy. Jednak określając typ object[]
, naprawdę nie ma żadnego ograniczenia, ponieważ wartość dowolnego typu może być przypisana do elementu tablicy tego typu.
Łączenie dwóch tablic (§7.7.3) zawsze powoduje utworzenie nowej tablicy, która nie jest ograniczona, nawet jeśli obie tablice są ograniczone przez ten sam typ. Na przykład
$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 Tablice jako typy referencyjne
Ponieważ typy tablic są typami referencyjnymi, można utworzyć zmienną, która wyznacza tablicę w celu odwoływania się do dowolnej tablicy dowolnej rangi, długości i typu elementu. Na przykład
$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
Przypisanie tablicy obejmuje płytką kopię; oznacza to, że przypisana zmienna odnosi się do tej samej tablicy, nie jest tworzona żadna kopia tablicy. Na przykład
$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
Następujące dane są zapisywane w potoku:
>10 20 30<
>10 20 30<
>6 20 30<
>6 20 30<
>8 20 30<
>6 20 30 40<
9.6 Tablice jako elementy tablicy
Każdy element tablicy może być tablicą. Na przykład
$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])<"
Następujący kod jest zapisywany w potoku:
$list refers to an array of length 3
>7<
>yes<
$list[1]
odnosi się do tablicy 1 elementu, liczby całkowitej 7, która jest dostępna za pośrednictwem $list[1][0]
, jak pokazano. Porównaj to z następującym subtelnie innym przypadkiem:
$list = $colors, 7, (1.2, "yes") # 7 has no prefix comma
">$($list[1])<"
W tym miejscu $list[1]
odnosi się do skalarnej liczby całkowitej 7, która jest dostępna za pośrednictwem $list[1]
.
Rozważmy następujący przykład:
$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 Ujemne indeksowanie
Omówiono to w §7.1.4.1.
9.8 Sprawdzanie granic
Omówiono to w §7.1.4.1.
9.9 Przekroje tablicy
Wycinek tablicy to nieograniczona tablica 1-wymiarowa, której elementy są kopiami zero lub więcej elementów z kolekcji. Wycinek tablicy jest tworzony za pomocą operatora indeksu []
(§7.1.4.5).
9.10 Kopiowanie tablicy
Ciągły zestaw elementów można skopiować z jednej tablicy do innej przy użyciu metody [array]::Copy
. Na przykład
$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 Wyliczanie po tablicy
Chociaż istnieje możliwość przejścia przez tablicę, uzyskując dostęp do każdego z jej elementów za pośrednictwem operatora indeksu, możemy wyliczyć elementy tej tablicy przy użyciu instrukcji foreach. W przypadku tablicy wielowymiarowej elementy są przetwarzane w porządku wierszowym. Na przykład
$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 Spłaszczanie tablic wielowymiarowych
Niektóre operacje na tablicy wielowymiarowej (na przykład replikacja (§7.6.3) i łączenie (§7.7.3)) wymagają, aby tablica została spłaszczona; czyli przekształcona w 1-wymiarową tablicę typu bez ograniczeń. Wynikowa tablica przyjmuje wszystkie elementy według porządku wierszowego.
Rozważmy następujący przykład:
$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
Tablica wyznaczona przez $c
zawiera elementy "czerwony", $true
, 10, 20, 30 i 40.