Over matrices
Korte beschrijving
Hierin worden matrices beschreven. Dit zijn gegevensstructuren die zijn ontworpen om verzamelingen items op te slaan.
Lange beschrijving
Een matrix is een gegevensstructuur die is ontworpen om een verzameling items op te slaan. De items kunnen van hetzelfde type of verschillende typen zijn.
Vanaf Windows PowerShell 3.0 heeft een verzameling van nul of één object enkele eigenschappen van matrices.
Een matrix maken en initialiseren
Als u een matrix wilt maken en initialiseren, wijst u meerdere waarden toe aan een variabele. De waarden die zijn opgeslagen in de matrix worden gescheiden door een komma en gescheiden van de naam van de variabele door de toewijzingsoperator (=).
Als u bijvoorbeeld een matrix met de naam $A wilt maken die de zeven numerieke waarden (int) van 22, 5, 10, 8, 12, 9 en 80 bevat, typt u:
$A = 22,5,10,8,12,9,80
U kunt ook een matrix maken en initialiseren met behulp van de bereikoperator (..). Als u bijvoorbeeld een matrix met de naam '$B' met de waarden 5 tot en met 8 wilt maken en initialiseren, typt u:
$B = 5..8
Als gevolg hiervan bevat $B vier waarden: 5, 6, 7 en 8.
Wanneer er geen gegevenstype is opgegeven, maakt PowerShell elke matrix als een objectmatrix (type: System.Object[]). Gebruik de methode GetType() om het gegevenstype van een matrix te bepalen. Als u bijvoorbeeld het gegevenstype van de $a-matrix wilt bepalen, typt u:
$a.GetType()
Als u een sterk getypte matrix wilt maken, dat wil gezegd een matrix die alleen waarden van een bepaald type kan bevatten, moet u de variabele casten als een matrixtype, zoals string[], long[] of int32[]. Als u een matrix wilt casten, plaatst u vóór de naam van de variabele een matrixtype tussen vierkante haken. Als u bijvoorbeeld een matrix met een 32-bits geheel getal wilt maken met de naam $ia met vier gehele getallen (1500, 2230, 3350 en 4000), typt u:
[int32[]]$ia = 1500,2230,3350,4000
Als gevolg hiervan kan de $ia matrix alleen gehele getallen bevatten.
U kunt matrices maken die worden gecast naar elk ondersteund type in de Microsoft .NET Framework. De objecten die Get-Process bijvoorbeeld ophaalt om processen te vertegenwoordigen, zijn van het type System.Diagnostics.Process. Als u een sterk getypte matrix van procesobjecten wilt maken, voert u de volgende opdracht in:
[Diagnostics.Process[]]$zz = Get-Process
De operator voor de subexpressie van de matrix
De operator voor de subexpressie van de matrix maakt een matrix, zelfs als deze nul of één object bevat.
De syntaxis van de matrixoperator is als volgt:
@( ... )
U kunt de matrixoperator gebruiken om een matrix van nul of één object te maken. Bijvoorbeeld:
PS> $a = @("Hello World")
PS> $a.Count
1
PS> $b = @()
PS> $b.Count
0
De matrixoperator is met name handig in scripts wanneer u objecten ophaalt, maar niet weet hoeveel objecten u krijgt. Bijvoorbeeld:
$p = @(Get-Process Notepad)
Zie about_Operators voor meer informatie over de operator voor matrixsubexpressie.
Matrixelementen openen en gebruiken
Een matrix lezen
U kunt verwijzen naar een matrix met behulp van de naam van de variabele. Als u alle elementen in de matrix wilt weergeven, typt u de naam van de matrix. Stel dat $a
een matrix gehele getallen 0, 1, 2 en 9 bevat. Typ:
$a
0
1
2
3
4
5
6
7
8
9
U kunt naar de elementen in een matrix verwijzen met behulp van een index, beginnend bij positie 0. Plaats het indexnummer tussen vierkante haken. Als u bijvoorbeeld het eerste element in de $a
matrix wilt weergeven, typt u:
$a[0]
0
Als u het derde element in de $a
matrix wilt weergeven, typt u:
$a[2]
2
U kunt een deel van de matrix ophalen met behulp van een bereikoperator voor de index. Als u bijvoorbeeld het tweede tot vijfde element van de matrix wilt ophalen, typt u:
$a[1..4]
1
2
3
4
Negatieve getallen tellen vanaf het einde van de matrix. '-1' verwijst bijvoorbeeld naar het laatste element van de matrix. Als u de laatste drie elementen van de matrix wilt weergeven, typt u:
$a = 0 .. 9
$a[-3..-1]
7
8
9
Als u negatieve indexen in aflopende volgorde typt, verandert de uitvoer.
$a = 0 .. 9
$a[-1..-3]
9
8
7
Wees echter voorzichtig bij het gebruik van deze notatie. De notatiecycli van de eindgrens tot het begin van de matrix.
$a = 0 .. 9
$a[2..-2]
2
1
0
9
8
Een veelvoorkomende fout is ook om aan te nemen dat $a[0..-2]
verwijst naar alle elementen van de matrix, met uitzondering van de laatste. Het verwijst naar de eerste, laatste en op een na laatste elementen in de matrix.
U kunt de plus-operator (+) gebruiken om een bereik te combineren met een lijst met elementen in een matrix. Als u bijvoorbeeld de elementen wilt weergeven op indexposities 0, 2 en 4 tot en met 6, typt u:
$a = 0 .. 9
$a[0,2+4..6]
0
2
4
5
6
Als u ook meerdere bereiken en afzonderlijke elementen wilt weergeven, kunt u de plus-operator gebruiken. Als u bijvoorbeeld elementen van nul tot twee, vier tot zes en het element op het achtste positietype wilt weergeven:
$a = 0..9
$a[+0..2+4..6+8]
0
1
2
4
5
6
8
Iteraties voor matrixelementen
U kunt ook lusconstructies gebruiken, zoals ForEach, For en While-lussen, om te verwijzen naar de elementen in een matrix. Als u bijvoorbeeld een ForEach-lus wilt gebruiken om de elementen in de $a
matrix weer te geven, typt u:
$a = 0..9
foreach ($element in $a) {
$element
}
0
1
2
3
4
5
6
7
8
9
De Foreach-lus doorloopt de matrix en retourneert elke waarde in de matrix totdat het einde van de matrix is bereikt.
De lus For is handig wanneer u tellers oploopt tijdens het onderzoeken van de elementen in een matrix. Als u bijvoorbeeld een For-lus wilt gebruiken om elke andere waarde in een matrix te retourneren, typt u:
$a = 0..9
for ($i = 0; $i -le ($a.length - 1); $i += 2) {
$a[$i]
}
0
2
4
6
8
U kunt een While-lus gebruiken om de elementen in een matrix weer te geven totdat een gedefinieerde voorwaarde niet meer waar is. Als u bijvoorbeeld de elementen in de $a
matrix wilt weergeven terwijl de matrixindex kleiner is dan 4, typt u:
$a = 0..9
$i=0
while($i -lt 4) {
$a[$i];
$i++
}
0
1
2
3
Eigenschappen van matrices
Count of Length of LongLength
Als u wilt bepalen hoeveel items zich in een matrix bevinden, gebruikt u de eigenschap of de Length
alias.Count
Longlength
is handig als de matrix meer dan 2.147.483.647 elementen bevat.
$a = 0..9
$a.Count
$a.Length
10
10
Positie
Retourneert het aantal dimensies in de matrix. De meeste matrices in PowerShell hebben slechts één dimensie. Zelfs als u denkt dat u een multidimensionale matrix maakt; zoals in het volgende voorbeeld:
$a = @(
@(0,1),
@("b", "c"),
@(Get-Process)
)
[int]$r = $a.Rank
"`$a rank: $r"
$a rank: 1
Voor het bouwen van een echt multidimensionale matrix in PowerShell is de hulp van .Net Framework vereist. Zoals in het volgende voorbeeld:
[int[,]]$rank2 = [int[,]]::new(5,5)
$rank2.rank
2
Methoden van matrices
Veilig
Hiermee stelt u alle elementwaarden in op de standaardwaarde van het elementtype van de matrix. Met de methode Clear() wordt de grootte van de matrix niet opnieuw ingesteld.
In het volgende voorbeeld $a
ziet u een matrix met objecten.
$a = 1, 2, 3
$a.Clear()
$a | % { $null -eq $_ }
True
True
True
In dit voorbeeld $intA
wordt expliciet getypt om gehele getallen te bevatten.
[int[]] $intA = 1, 2, 3
$intA.Clear()
$intA
0
0
0
ForEach
Hiermee kunt u alle elementen in de matrix herhalen en een bepaalde bewerking uitvoeren voor elk element van de matrix.
De ForEach-methode heeft verschillende overbelastingen die verschillende bewerkingen uitvoeren.
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(scriptblock-expressie)
ForEach(scriptblock-expressie, object[] argumenten)
Notitie
De syntaxis vereist het gebruik van een scriptblok. Haakjes zijn optioneel.
In het volgende voorbeeld ziet u hoe u de foreach-methode gebruikt. In dit geval is het de bedoeling om de kwadratische waarde van de elementen in de matrix te genereren.
Houd er rekening mee dat deze methode is toegevoegd in PowerShell v4 en niet beschikbaar is in versies eronder. Voor eerdere versies gebruikt u de Pipelining-methode voor de ForEach-Object Cmdlet
$a = @(0 .. 3)
$a.ForEach({ $_ * $_})
0
1
4
9
Net als de -ArgumentList
parameter van ForEach-Object
, staat de arguments
parameter toe dat een matrix van argumenten wordt doorgegeven aan een scriptblok dat is geconfigureerd om deze te accepteren.
ForEach(type convertToType)
De ForEach
methode kan worden gebruikt om de elementen snel naar een ander type te casten. In het volgende voorbeeld ziet u hoe u een lijst met tekenreeksdatums converteert naar [DateTime]
type.
@("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(tekenreeks propertyName)
ForEach(string propertyName, object[] newValue)
De ForEach
methode kan ook worden gebruikt om snel eigenschapswaarden op te halen of in te stellen voor elk item in de verzameling.
# 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(string methodName)
ForEach(string methodName, object[] argumenten)
Ten slotte ForEach
kunnen methoden worden gebruikt om een methode uit te voeren op elk item in de verzameling.
("one", "two", "three").ForEach("ToUpper")
ONE
TWO
THREE
Net als de -ArgumentList
parameter van ForEach-Object
, staat de arguments
parameter toe dat een matrix van argumenten wordt doorgegeven aan een scriptblok dat is geconfigureerd om deze te accepteren.
Notitie
Vanaf Windows PowerShell 3.0 kunt u voor elk item in een verzameling ook eigenschappen ophalen en methoden uitvoeren met behulp van 'Methoden van scalaire objecten en verzamelingen'. Meer informatie hierover vindt u hier about_methods
Waar
Hiermee kunt u de elementen van de matrix filteren of selecteren. Het script moet iets anders evalueren dan: nul (0), lege tekenreeks, $false
of om ervoor te zorgen dat $null
het element wordt weergegeven na de Where
Er is één definitie voor de Where
methode.
Where(scriptblock expression[, WhereOperatorSelectionMode mode
[, int numberToReturn]])
Het Expression
scriptblok is vereist voor filteren, het mode
optionele argument biedt aanvullende selectiemogelijkheden en het numberToReturn
optionele argument maakt het mogelijk om het aantal items te beperken dat door het filter wordt geretourneerd.
Notitie
De syntaxis vereist het gebruik van een scriptblok. Haakjes zijn optioneel.
In het volgende voorbeeld ziet u hoe u alle oneven getallen uit de matrix selecteert.
(0..9).Where{ $_ % 2 }
1
3
5
7
9
De volgende selectiemodi zijn beschikbaar.
Standaard
De Default
modus filtert items met behulp van het Expression
scriptblock.
Als er een numberToReturn
is opgegeven, wordt het maximum aantal items opgegeven dat moet worden geretourneerd.
# 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)
Notitie
Zowel de modus als First
de Default
modus retourneren de eerste (numberToReturn
) items en kunnen door elkaar worden gebruikt.
Laatste
$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
In de SkipUntil
modus worden alle objecten in een verzameling overgeslagen totdat een object het scriptblokexpressiefilter doorgeeft. Vervolgens worden ALLE resterende verzamelingsitems geretourneerd zonder deze te testen. Er wordt slechts één doorgevend item getest
Dit betekent dat de geretourneerde verzameling zowel doorgegeven als niet-doorgegeven items bevat die NIET zijn getest.
Het aantal geretourneerde items kan worden beperkt door een waarde door te geven aan het numberToReturn
argument.
$computers = "Server01", "Server02", "Server03", "localhost", "Server04"
# Find the first available online server.
$computers.Where({ Test-Connection $_ }, 'SkipUntil', 1)
localhost
Tot
De Until
modus draait de SkipUntil
modus om. Hiermee worden ALLE items in een verzameling geretourneerd totdat een item de scriptblokexpressie doorgeeft. Zodra een item de scriptblock-expressie doorgeeft , stopt de methode met het Where
verwerken van items.
Dit betekent dat u de eerste set niet-doorgegeven items van de Where
methode ontvangt. Nadat één item is geslaagd, wordt de rest NIET getest of geretourneerd.
Het aantal geretourneerde items kan worden beperkt door een waarde door te geven aan het numberToReturn
argument.
# 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
Notitie
Zowel Until
als SkipUntil
werken onder de premisse van HET NIET testen van een batch met items.
Until
retourneert de items VÓÓR de eerste doorgang.
SkipUntil
retourneert alle items NA de eerste doorgang, inclusief het eerste doorgegeven item.
Splitsen
De Split
modus splitst of groepeert verzamelingsitems in twee afzonderlijke verzamelingen. Degenen die de scriptblock-expressie doorgeven en degenen die dat niet doen.
Als een numberToReturn
is opgegeven, bevat de eerste verzameling de doorgegeven items, zodat de opgegeven waarde niet wordt overschreden.
De resterende objecten, zelfs de objecten die HET expressiefilter DOORGEVEN , worden geretourneerd in de tweede verzameling.
$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
...
De leden van een matrix ophalen
Als u de eigenschappen en methoden van een matrix wilt ophalen, zoals de eigenschap Length en de methode SetValue, gebruikt u de parameter InputObject van de Get-Member cmdlet.
Wanneer u een matrix doorstuurt naar Get-Member
, verzendt PowerShell de items één voor één en Get-Member
retourneert het type van elk item in de matrix (dubbele items worden genegeerd).
Wanneer u de parameter -InputObject gebruikt, Get-Member
worden de leden van de matrix geretourneerd.
Met de volgende opdracht worden bijvoorbeeld de leden van de $a
matrixvariabele ophaalt.
Get-Member -InputObject $a
U kunt de leden van een matrix ook ophalen door een komma (,) te typen vóór de waarde die wordt doorgesluisd naar de Get-Member cmdlet. De komma maakt de matrix het tweede item in een matrix van matrices. Windows PowerShell de matrices een voor een door en Get-Member retourneert de leden van de matrix. Zoals in de volgende twee voorbeelden.
,$a | Get-Member
,(1,2,3) | Get-Member
Een matrix bewerken
U kunt de elementen in een matrix wijzigen, een element toevoegen aan een matrix en de waarden van twee matrices combineren tot een derde matrix.
Als u de waarde van een bepaald element in een matrix wilt wijzigen, geeft u de matrixnaam en de index op van het element dat u wilt wijzigen en gebruikt u vervolgens de toewijzingsoperator (=) om een nieuwe waarde voor het element op te geven. Als u bijvoorbeeld de waarde van het tweede item in de $a
matrix (indexpositie 1) wilt wijzigen in 10, typt u:
$a[1] = 10
U kunt ook de methode SetValue van een matrix gebruiken om een waarde te wijzigen. In het volgende voorbeeld wordt de tweede waarde (indexpositie 1) van de $a
matrix gewijzigd in 500:
$a.SetValue(500,1)
U kunt de operator += gebruiken om een element toe te voegen aan een matrix. In het volgende voorbeeld ziet u hoe u een element toevoegt aan de $a
matrix.
$a = @(0..4)
$a += 5
Notitie
Wanneer u de +=
operator gebruikt, maakt PowerShell in feite een nieuwe matrix met de waarden van de oorspronkelijke matrix en de toegevoegde waarde. Dit kan prestatieproblemen veroorzaken als de bewerking meerdere keren wordt herhaald of als de grootte van de matrix te groot is.
Het is niet eenvoudig om elementen uit een matrix te verwijderen, maar u kunt wel een nieuwe matrix maken die alleen geselecteerde elementen van een bestaande matrix bevat. Als u bijvoorbeeld de $t
matrix wilt maken met alle elementen in de $a
matrix, met uitzondering van de waarde op indexpositie 2, typt u:
$t = $a[0,1 + 3..($a.length - 1)]
Als u twee matrices wilt combineren tot één matrix, gebruikt u de plus-operator (+). In het volgende voorbeeld worden twee matrices gemaakt, gecombineerd en vervolgens de resulterende gecombineerde matrix weergegeven.
$x = 1,3
$y = 5,9
$z = $x + $y
Als gevolg hiervan bevat de $z
matrix 1, 3, 5 en 9.
Als u een matrix wilt verwijderen, wijst u een waarde van $null toe aan de matrix. Met de volgende opdracht wordt de matrix in de $a
variabele verwijderd.
$a = $null
U kunt ook de Remove-Item
cmdlet gebruiken, maar het toewijzen van een waarde van $null
is sneller, met name voor grote matrices.
Matrices van nul of één
Vanaf Windows PowerShell 3.0 heeft een verzameling van nul of één object de eigenschap Count en Length. U kunt ook indexeren in een matrix van één object. Met deze functie kunt u scriptfouten voorkomen die optreden wanneer een opdracht die een verzameling verwacht minder dan twee items krijgt.
In de volgende voorbeelden ziet u deze functie.
Nul objecten
$a = $null
$a.Count
$a.Length
0
0
Eén object
$a = 4
$a.Count
$a.Length
$a[0]
$a[-1]
1
1
4
4