Kommentar
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
Redaktionell anteckning
Viktig
Windows PowerShell Language Specification 3.0 publicerades i december 2012 och baseras på Windows PowerShell 3.0. Den här specifikationen återspeglar inte det aktuella tillståndet för PowerShell. Det finns ingen plan för att uppdatera den här dokumentationen för att återspegla det aktuella tillståndet. Den här dokumentationen presenteras här för historisk referens.
Specifikationsdokumentet är tillgängligt som ett Microsoft Word-dokument från Microsoft Download Center på: https://www.microsoft.com/download/details.aspx?id=36389 Att Word-dokumentet har konverterats för presentation här på Microsoft Learn. Under konverteringen har vissa redaktionella ändringar gjorts för att anpassa formateringen för Docs-plattformen. Vissa stavfel och mindre fel har korrigerats.
9.1 Introduktion
PowerShell stöder matriser med en eller flera dimensioner där varje dimension har noll eller fler element. I en dimension numreras elementen i stigande heltalsordning och börjar på noll.
Varje enskilt element kan nås via matrisens indexoperator [] (§7.1.4). Antalet dimensioner i en matris kallas dess rangordning.
Ett element kan innehålla ett värde av vilken typ som helst, inklusive en matristyp. En matris med ett eller flera element vars värden är av valfri matristyp kallas för en ojämn matris. En flerdimensionell matris har flera dimensioner, i vilket fall antalet element i varje rad i en dimension är detsamma. Ett element i en fragmenterad matris kan innehålla en flerdimensionell matris och vice versa.
Flerdimensionella matriser lagras i rad-större ordning. Antalet element i en matris kallas matrisens längd, som är fast när matrisen skapas. Därför kan elementen i en 1-dimensionell matris A med längden N nås (d.v.s. nedsänkt) med hjälp av uttrycken A[0], A[1], ..., A[N-1]. Elementen i en 2-dimensionell matris B med M rader, där varje rad har N kolumner, kan nås med hjälp av uttrycken 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].
Och så vidare för matriser med tre eller fler dimensioner.
Som standard är en matris polymorf; Dvs. dess element behöver inte alla ha samma typ. Till exempel
$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
En 1-dimensionell matris har typen type[], en 2-dimensionell matris har typen type[,], en 3-dimensionell matris har typen type[,,]och så vidare, där typ är objekt för en obegränsad typmatris eller den begränsade typen för en begränsad matris (§9.4).
Alla matristyper härleds från typen Matris (§4.3.2).
9.2 Matrisskapande
En array skapas via ett array-skapande uttryck, som har följande former: unär kommaoperator (§7.2.1),array-expression (§7.1.7), binär kommaoperator (§7.3), intervalloperator (§7.4) eller New-Object cmdlet.
Här är några exempel på skapande och användning av matriser:
$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
}
Följande skrivs till pipelinen:
$values[0] = 10
$values[1] = 20
$values[2] = 30
10
False
red
10.50
Standardvärdet för ett element som inte uttryckligen initierats är standardvärdet för elementets typ (dvs. $false, noll eller $null).
9.3 Arraysammanfogning
Matriser av godtycklig typ och längd kan sammanfogas via operatorerna + och +=, som båda resulterar i skapandet av en ny obehindrat 1-dimensionell matris. De befintliga matriserna är oförändrade. Mer information finns i §7.7.3 och §9.4 för en diskussion om att lägga till en matris av begränsad typ.
9.4 Typer av begränsningselement
En 1-dimensionell matris kan skapas så att den är typbegränsad genom att prefixa uttrycket för att skapa matriser med en matristyp. Till exempel
$a = [int[]](1,2,3,4) # constrained to int
$a[1] = "abc" # implementation-defined behavior
$a += 1.23 # new array is unconstrained
Syntaxen för att skapa en flerdimensionell matris kräver specifikationen av en typ, och den typen blir villkorstypen för matrisen. Men genom att ange typ object[]finns det egentligen ingen begränsning eftersom ett värde av någon typ kan tilldelas till ett element i en matris av den typen.
Att sammanfoga två arrayer (§7.7.3) resulterar alltid i en ny array som är obegränsad, även om båda arrayerna är begränsade av samma typ. Till exempel
$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 Arrayer som referenstyper
Eftersom matristyper är referenstyper kan en variabel som anger en matris göras för att referera till valfri matris av valfri rangordning, längd och elementtyp. Till exempel
$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
Tilldelningen av en matris omfattar en ytlig kopia. variabeln som tilldelats refererar till samma matris, utan att någon kopia av matrisen görs. Till exempel
$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
Följande skrivs till pipelinen:
>10 20 30<
>10 20 30<
>6 20 30<
>6 20 30<
>8 20 30<
>6 20 30 40<
9,6 matriser som matriselement
Alla element i en matris kan i sig vara en matris. Till exempel
$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])<"
Följande skrivs till pipelinen:
$list refers to an array of length 3
>7<
>yes<
$list[1] refererar till en matris med 1 element, heltal 7, som nås via $list[1][0], som visas. Jämför detta med följande subtilt olika fall:
$list = $colors, 7, (1.2, "yes") # 7 has no prefix comma
">$($list[1])<"
Här refererar $list[1] till en skalär, heltal 7, som nås via $list[1].
Tänk dig följande exempel:
$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 Negativa indexeringar
Detta diskuteras i §7.1.4.1.
9.8 Gränskontroll
Detta diskuteras i §7.1.4.1.
9.9 Fältavsnitt
En matrissektor är en obegränsad 1-dimensionell matris vars element är kopior av noll eller fler element från en samling. En array-segment skapas via subskriptoperatorn [] (§7.1.4.5).
9.10 Kopiera en matris
En sammanhängande uppsättning element kan kopieras från en matris till en annan med hjälp av metoden [array]::Copy. Till exempel
$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 Räkna upp över en matris
Även om det är möjligt att loopa igenom en matris för att få tillgång till dess element via hakparentesoperatorn, kan vi enumerera över matrisens element genom att använda foreach-instruktionen. För en flerdimensionell matris bearbetas elementen i rad-större ordning. Till exempel
$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 Flerdimensionell array-flätning
Vissa åtgärder på en flerdimensionell matris (till exempel replikering (§7.6.3) och sammanfogning (§7.7.3)) kräver att matrisen är utplattad; som ska omvandlas till en 1-dimensionell matris av obehindrat typ. Den resulterande matrisen antar alla element i radvis ordning.
Tänk på följande exempel:
$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
Matrisen som anges av $c innehåller elementen "röd", $true, 10, 20, 30 och 40.