Dela via


Om matriser

Kort beskrivning

Beskriver matriser, som är datastrukturer som är utformade för att lagra samlingar av objekt.

Lång beskrivning

En matris är en datastruktur som är utformad för att lagra en samling objekt. Objekten kan vara av samma typ eller olika typer.

Från och med Windows PowerShell 3.0 har en samling med noll eller ett objekt vissa egenskaper för matriser.

Skapa och initiera en matris

Om du vill skapa och initiera en matris tilldelar du flera värden till en variabel. Värdena som lagras i matrisen avgränsas med ett kommatecken och avgränsas från variabelnamnet av tilldelningsoperatorn (=).

Om du till exempel vill skapa en matris med namnet $A som innehåller de sju numeriska (int) värdena 22, 5, 10, 8, 12, 9 och 80 skriver du:

$A = 22,5,10,8,12,9,80

Du kan också skapa och initiera en matris med hjälp av intervalloperatorn (..). Om du till exempel vill skapa och initiera en matris med namnet "$B" som innehåller värdena 5 till 8 skriver du:

$B = 5..8

Därför innehåller $B fyra värden: 5, 6, 7 och 8.

När ingen datatyp anges skapar PowerShell varje matris som en objektmatris (typ: System.Object[]). Om du vill fastställa datatypen för en matris använder du metoden GetType(). Om du till exempel vill fastställa datatypen för matrisen $a skriver du:

$a.GetType()

Om du vill skapa en starkt typifierad matris, d.v.s. en matris som endast kan innehålla värden av en viss typ, omvandlar du variabeln som en matristyp, till exempel string[], long[] eller int32[]. Om du vill omvandla en matris föregår du variabelnamnet med en matristyp inom hakparenteser. Om du till exempel vill skapa en 32-bitars heltalsmatris med namnet $ia som innehåller fyra heltal (1500, 2230, 3350 och 4000) skriver du:

[int32[]]$ia = 1500,2230,3350,4000

Därför kan matrisen $ia bara innehålla heltal.

Du kan skapa matriser som omvandlas till valfri typ som stöds i Microsoft .NET Framework. De objekt som Get-Process hämtar för att representera processer är till exempel av typen System.Diagnostics.Process. Om du vill skapa en starkt skriven matris med processobjekt anger du följande kommando:

[Diagnostics.Process[]]$zz = Get-Process

Matrisens underuttrycksoperator

Operatorn för matrisunderuttryck skapar en matris, även om den innehåller noll eller ett objekt.

Syntaxen för matrisoperatorn är följande:

@( ... )

Du kan använda matrisoperatorn för att skapa en matris med noll eller ett objekt. Till exempel:

PS> $a = @("Hello World")
PS> $a.Count
1
PS> $b = @()
PS> $b.Count
0

Arrayoperatorn är särskilt användbar i skript när du hämtar objekt, men inte vet hur många objekt du kommer att få. Till exempel:

$p = @(Get-Process Notepad)

Mer information om operatorn för matrisunderuttryck finns i about_Operators.

Komma åt och använda matriselement

Läsa ett fält

Du kan referera till en matris med hjälp av dess variabelnamn. Om du vill visa alla element i matrisen skriver du matrisnamnet. Anta $a till exempel att det är en matris som innehåller heltalen 0, 1, 2, tills 9 och skriver:

$a
0
1
2
3
4
5
6
7
8
9

Du kan referera till elementen i en matris med hjälp av ett index, med början vid position 0. Omslut indexnumret inom hakparenteser. Om du till exempel vill visa det första elementet i $a matris skriver du:

$a[0]
0

Om du vill visa det tredje elementet i matrisen $a skriver du:

$a[2]
2

Du kan hämta en del av matrisen med hjälp av en intervalloperator för indexet. Om du till exempel vill hämta det andra till femte elementet i matrisen skriver du:

$a[1..4]
1
2
3
4

Negativa tal räknas från slutet av matrisen. Refererar till exempel "-1" till det sista elementet i matrisen. Om du vill visa de tre sista elementen i matrisen skriver du i indexstigande ordning:

$a = 0 .. 9
$a[-3..-1]
7
8
9

Om du skriver negativa index i fallande ordning ändras dina utdata.

$a = 0 .. 9
$a[-1..-3]
9
8
7

Var dock försiktig när du använder den här notationen. Notationen växlar från slutgränsen till början av matrisen.

$a = 0 .. 9
$a[2..-2]
2
1
0
9
8

Ett vanligt misstag är också att anta att $a[0..-2] refererar till alla element i matrisen, förutom den sista. Den refererar till de första, sista och näst sista elementen i matrisen.

Du kan använda plusoperatorn (+) för att kombinera ett intervall med en lista med element i en matris. Om du till exempel vill visa elementen vid indexpositionerna 0, 2 och 4 till 6 skriver du:

$a = 0 .. 9
$a[0,2+4..6]
0
2
4
5
6

Om du vill visa en lista över flera intervall och enskilda element kan du också använda plusoperatorn. Om du till exempel vill visa elementen noll till två, fyra till sex och elementet vid den åttonde positionstypen:

$a = 0..9
$a[+0..2+4..6+8]
0
1
2
4
5
6
8

Iterationer över matriselement

Du kan också använda loopkonstruktioner, till exempel ForEach-, For- och While-loopar, för att referera till elementen i en matris. Om du till exempel vill använda en ForEach-loop för att visa elementen i matrisen $a skriver du:

$a = 0..9
foreach ($element in $a) {
  $element
}
0
1
2
3
4
5
6
7
8
9

Loopen Foreach itererar genom matrisen och returnerar varje värde i matrisen tills den når slutet av matrisen.

For-loopen är användbar när du ökar räknare när du undersöker elementen i en matris. Om du till exempel vill använda en For loop för att returnera vartannat värde i en matris skriver du:

$a = 0..9
for ($i = 0; $i -le ($a.length - 1); $i += 2) {
  $a[$i]
}
0
2
4
6
8

Du kan använda en While-loop för att visa elementen i en array tills ett definierat villkor inte längre är sant. Om du till exempel vill visa elementen i den $a matrisen medan matrisindexet är mindre än 4 skriver du:

$a = 0..9
$i=0
while($i -lt 4) {
  $a[$i];
  $i++
}
0
1
2
3

Egenskaper för matriser

Antal eller Längd eller LongLength

Om du vill ta reda på hur många objekt som finns i en matris använder du Length egenskapen eller dess Count alias. Longlength är användbart om matrisen innehåller fler än 2 147 483 647 element.

$a = 0..9
$a.Count
$a.Length
10
10

Rangordning

Returnerar antalet dimensioner i matrisen. De flesta matriser i PowerShell har bara en dimension. Även när du tror att du bygger en multidimensionell matris; som i följande exempel:

$a = @(
  @(0,1),
  @("b", "c"),
  @(Get-Process)
)

[int]$r = $a.Rank
"`$a rank: $r"
$a rank: 1

Att skapa en verkligt flerdimensionell matris i PowerShell kräver hjälp av .Net Framework. Som i följande exempel:

[int[,]]$rank2 = [int[,]]::new(5,5)
$rank2.rank
2

Metoder för arrayer

Klar

Anger alla elementvärden till det standardvärdet av matrisens elementtyp. Metoden Clear() återställer inte storleken på arrayen.

I följande exempel är $a en matris med objekt.

$a = 1, 2, 3
$a.Clear()
$a | % { $null -eq $_ }
True
True
True

I det här exemplet skrivs $intA uttryckligen för att innehålla heltal.

[int[]] $intA = 1, 2, 3
$intA.Clear()
$intA
0
0
0

För Var och en

Gör det möjligt att iterera över alla element i matrisen och utföra en viss åtgärd för varje element i matrisen.

Metoden ForEach har flera överlagringar som utför olika åtgärder.

ForEach(scriptblock expression)
ForEach(type convertToType)
ForEach(string propertyName)
ForEach(string propertyName, object[] newValue)
ForEach(string methodName)
ForEach(string methodName, object[] arguments)
ForEach(scriptblock expression, object[] arguments)

ForEach(skriptblocksuttryck)

ForEach(skriptblockuttryck, objekt[]-argument)

Anmärkning

Syntaxen kräver användning av ett skriptblock. Parenteser är valfria.

I följande exempel visas hur du använder foreach metoden . I det här fallet är avsikten att generera kvadratvärdet för elementen i matrisen.

Observera att den här metoden lades till i PowerShell v4 och inte är tillgänglig i versioner under denna. För tidigare versioner använder du Pipelining-metoden för att ForEach-Object Cmdlet

$a = @(0 .. 3)
$a.ForEach({ $_ * $_})
0
1
4
9

Precis som parametern -ArgumentListför ForEach-Object tillåter parametern att arguments en matris med argument skickas till ett skriptblock som konfigurerats för att acceptera dem.

ForEach(typ convertToType)

Metoden ForEach kan användas för att snabbt omvandla elementen till en annan typ. I följande exempel visas hur du konverterar en lista med strängdatum till [DateTime] typ.

@("1/1/2017", "2/1/2017", "3/1/2017").ForEach([datetime])

Sunday, January 1, 2017 12:00:00 AM
Wednesday, February 1, 2017 12:00:00 AM
Wednesday, March 1, 2017 12:00:00 AM

ForEach(sträng propertyName)

ForEach(sträng propertyName, object[] newValue)

Metoden ForEach kan också användas för att snabbt hämta eller ange egenskapsvärden för varje objekt i samlingen.

# Set all LastAccessTime properties of files to the current date.
(dir 'C:\Temp').ForEach('LastAccessTime', (Get-Date))
# View the newly set LastAccessTime of all items, and find Unique entries.
(dir 'C:\Temp').ForEach('LastAccessTime') | Get-Unique
Wednesday, June 20, 2018 9:21:57 AM

ForEach(sträng metodnamn)

ForEach(sträng metodnamn, objekt[] argument)

Slutligen kan ForEach metoder användas för att köra en metod på varje objekt i samlingen.

("one", "two", "three").ForEach("ToUpper")
ONE
TWO
THREE

Precis som parametern -ArgumentListför ForEach-Object tillåter parametern att arguments en matris med argument skickas till ett skriptblock som konfigurerats för att acceptera dem.

Anmärkning

Från och med Windows PowerShell 3.0 kan hämtning av egenskaper och körningsmetoder för varje objekt i en samling också utföras med hjälp av "Metoder för skalära objekt och samlingar" Du kan läsa mer om det här about_methods

Var

Tillåter att du filtrerar eller väljer elementen i matrisen. Skriptet måste utvärderas till något annat än: noll (0), tom sträng $false eller $null för att elementet ska visas efter Where

Det finns en definition för metoden Where.

Where(scriptblock expression[, WhereOperatorSelectionMode mode
                            [, int numberToReturn]])

Det Expression är skriptblock som krävs för filtrering, det mode valfria argumentet tillåter ytterligare urvalsfunktioner och det numberToReturn valfria argumentet gör det möjligt att begränsa hur många objekt som returneras från filtret.

Anmärkning

Syntaxen kräver användning av ett skriptblock. Parenteser är valfria.

I följande exempel visas hur du väljer alla udda tal från matrisen.

(0..9).Where{ $_ % 2 }
1
3
5
7
9

Följande vallägen är tillgängliga.

Förinställning

Default-läget filtrerar objekt med hjälp av Expression scriptblock.

Om en numberToReturn anges anger den det maximala antalet objekt som ska returneras.

# Get the zip files in the current users profile, sorted by LastAccessTime.
$Zips = dir $env:userprofile -Recurse '*.zip' | Sort-Object LastAccessTime
# Get the least accessed file over 100MB
$Zips.Where({$_.Length -gt 100MB}, 'Default', 1)

Anmärkning

Både Default-läget och First-läget returnerar de första (numberToReturn) objekten och kan användas utbytbart.

Sist

$h = (Get-Date).AddHours(-1)
$logs = dir 'C:\' -Recurse '*.log' | Sort-Object CreationTime
# Find the last 5 log files created in the past hour.
$logs.Where({$_.CreationTime -gt $h}, 'Last', 5)

SkipUntil (Hoppa över)

Läget SkipUntil hoppar över alla objekt i en samling tills ett objekt passerar genom skriptblockuttrycksfiltret. Den returnerar sedan ALLA återstående samlingsobjekt utan att testa dem. Endast ett godkänt objekt testas

Det innebär att den returnerade samlingen kommer att innehålla både godkända och icke-överförda objekt som INTE har testats.

Antalet returnerade objekt kan begränsas genom att ett värde skickas till argumentet numberToReturn.

$computers = "Server01", "Server02", "Server03", "localhost", "Server04"
# Find the first available online server.
$computers.Where({ Test-Connection $_ }, 'SkipUntil', 1)
localhost

Tills

Until-läget inverterar SkipUntil-läget. Den returnerar ALLA objekt i en samling tills ett objekt klarar uttrycket i skriptblocket. När ett objekt skickar skriptblockeringsuttrycket slutar Where-metoden att bearbeta objekt.

Detta innebär att du kommer att få den första uppsättningen icke-överförande objekt från Where metoden. När en vara har passerat kommer resten INTE att testas eller returneras.

Antalet returnerade objekt kan begränsas genom att ett värde skickas till argumentet numberToReturn.

# Retrieve the first set of numbers less than or equal to 10.
(1..50).Where({$_ -gt 10}, 'Until')
# This would perform the same operation.
(1..50).Where({$_ -le 10})
1
2
3
4
5
6
7
8
9
10

Anmärkning

Både Until och SkipUntil fungera under förutsättning att INTE testa en batch med objekt.

Until returnerar objekten FÖRE det första passet.

SkipUntil returnerar alla objekt EFTER det första passet, inklusive det första objektet som passerar.

Dela

Det Split läget delar upp eller grupperar samlingsobjekt i två separata samlingar. De som klarar skriptblocksuttrycket och de som inte gör det.

Om a numberToReturn anges kommer den första samlingen att innehålla de objekt som skickas , för att inte överskrida det angivna värdet.

De återstående objekten, även de som PASSERAR uttrycksfiltret, returneras i den andra samlingen.

$running, $stopped = (Get-Service).Where({$_.Status -eq 'Running'}, 'Split')
$running
Status   Name               DisplayName
------   ----               -----------
Running  Appinfo            Application Information
Running  AudioEndpointBu... Windows Audio Endpoint Builder
Running  Audiosrv           Windows Audio
...
$stopped
Status   Name               DisplayName
------   ----               -----------
Stopped  AJRouter           AllJoyn Router Service
Stopped  ALG                Application Layer Gateway Service
Stopped  AppIDSvc           Application Identity
...

Hämta medlemmar i en matris

Om du vill hämta egenskaperna och metoderna för en matris, till exempel Length egenskapen och SetValue metoden, använder du parametern InputObject för cmdleten Get-Member.

När du skickar en matris till Get-Memberskickar PowerShell objekten en i taget och Get-Member returnerar typen av varje objekt i matrisen (ignorerar dubbletter).

När du använder parametern Get-Member returneras medlemmarna i matrisen.

Följande kommando hämtar till exempel medlemmarna i $a matrisvariabeln.

Get-Member -InputObject $a

Du kan också hämta medlemmarna i en matris genom att skriva ett kommatecken (,) före värdet som skickas till cmdleten Get-Member. Kommatecknet gör matrisen till det andra objektet i en matris med matriser. Windows PowerShell skickar matriserna en i taget och returnerar Get-Member medlemmarna i matrisen. Som de två följande exemplen.

,$a | Get-Member

,(1,2,3) | Get-Member

Manipulera en array

Du kan ändra elementen i en matris, lägga till ett element i en matris och kombinera värdena från två matriser till en tredje matris.

Om du vill ändra värdet för ett visst element i en matris anger du matrisnamnet och indexet för det element som du vill ändra och använder sedan tilldelningsoperatorn (=) för att ange ett nytt värde för elementet. Om du till exempel vill ändra värdet för det andra objektet i matrisen $a (indexposition 1) till 10 skriver du:

$a[1] = 10

Du kan också använda metoden SetValue för en array för att ändra ett värde. I följande exempel ändras det andra värdet (indexposition 1) för $a matris till 500:

$a.SetValue(500,1)

Du kan använda operatorn += för att lägga till ett element i en matris. I följande exempel visas hur du lägger till ett element i den $a matrisen.

$a = @(0..4)
$a += 5

Anmärkning

När du använder operatorn += skapar PowerShell faktiskt en ny matris med värdena för den ursprungliga matrisen och det extra värdet. Detta kan orsaka prestandaproblem om åtgärden upprepas flera gånger eller om matrisens storlek är för stor.

Det är inte lätt att ta bort element från en matris, men du kan skapa en ny matris som bara innehåller valda element i en befintlig matris. Om du till exempel vill skapa $t-matrisen med alla element i $a-matrisen utom värdet vid indexposition 2, skriver du:

$t = $a[0,1 + 3..($a.length - 1)]

Om du vill kombinera två matriser till en enda matris använder du plusoperatorn (+). Följande exempel skapar två matriser, kombinerar dem och visar sedan den resulterande kombinerade matrisen.

$x = 1,3
$y = 5,9
$z = $x + $y

Därför innehåller $z matrisen 1, 3, 5 och 9.

Om du vill ta bort en matris tilldelar du värdet $null till matrisen. Följande kommando tar bort matrisen i variabeln $a.

$a = $null

Du kan också använda cmdleten Remove-Item, men det går snabbare att tilldela ett värde på $null, särskilt för stora matriser.

Matriser med noll eller en

Från och med Windows PowerShell 3.0 har en samling med noll eller ett objekt egenskapen Antal och Längd. Du kan också indexera till en matris med ett objekt. Den här funktionen hjälper dig att undvika skriptfel som uppstår när ett kommando som förväntar sig att en samling får färre än två objekt.

I följande exempel visas den här funktionen.

Noll objekt

$a = $null
$a.Count
$a.Length
0
0

Ett objekt

$a = 4
$a.Count
$a.Length
$a[0]
$a[-1]
1
1
4
4

Se även