Delen via


about_Arrays

Korte beschrijving

Beschrijft matrices, die gegevensstructuren zijn die zijn ontworpen voor het opslaan van verzamelingen items.

Lange beschrijving

Een matrix is een gegevensstructuur die is ontworpen voor het opslaan van een verzameling items. De items kunnen hetzelfde type of verschillende typen zijn.

Vanaf Windows PowerShell 3.0 heeft een verzameling 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 in de matrix zijn opgeslagen, worden gescheiden door een komma en gescheiden van de naam van de variabele door de toewijzingsoperator (=).

Als u bijvoorbeeld een matrix $A wilt maken die de zeven numerieke waarden (geheel getal) van 22, 5, 10, 8, 12, 9 en 80 bevat, typt u:

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

De komma kan ook worden gebruikt om één itemmatrix te initialiseren door de komma voor het ene item te plaatsen.

Als u bijvoorbeeld één itemmatrix $B wilt maken met de enkele waarde 7, typt u:

$B = ,7

U kunt ook een matrix maken en initialiseren met behulp van de bereikoperator (..). In het volgende voorbeeld wordt een matrix gemaakt met de waarden 5 tot en met 8.

$C = 5..8

Als gevolg hiervan $C bevat u vier waarden: 5, 6, 7 en 8.

Als er geen gegevenstype is opgegeven, maakt PowerShell elke matrix als een objectmatrix (System.Object[]). Gebruik de GetType() methode om het gegevenstype van een matrix te bepalen. Voorbeeld:

$A.GetType()

Als u een sterk getypte matrix wilt maken, dat wil gezegd: een matrix die alleen waarden van een bepaald type kan bevatten, cast de variabele als een matrixtype, zoals tekenreeks[], long[]of int32[].. Als u een matrix wilt casten, gaat u vooraf aan de naam van de variabele met een matrixtype tussen vierkante haken. Voorbeeld:

[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 .NET. De objecten die Get-Process worden opgehaald om processen weer te geven, zijn bijvoorbeeld van het type System.Diagnostics.Process . Als u een sterk getypte matrix met procesobjecten wilt maken, voert u de volgende opdracht in:

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

De operator matrixsubexpressie

De operator voor subexpressie van de matrix maakt een matrix op basis van de instructies erin. Wat de instructie binnen de operator ook produceert, de operator plaatst deze in een matrix. Zelfs als er nul of één object is.

De syntaxis van de matrixoperator is als volgt:

@( ... )

U kunt de matrixoperator gebruiken om een matrix van nul of één object te maken. Voorbeeld:

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

De matrixoperator is handig in scripts wanneer u objecten ophaalt, maar u weet niet hoeveel u kunt verwachten. Voorbeeld:

$p = @(Get-Process Notepad)

Zie about_Operators voor meer informatie over de operator voor matrixsubexpressie.

Matrixelementen openen en gebruiken

Een matrix lezen

U kunt naar een matrix verwijzen met de naam van de variabele. Als u alle elementen in de matrix wilt weergeven, roept u de matrixnaam aan. Is bijvoorbeeld $a een matrix van de getallen 0 tot en met 9:

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

U kunt verwijzen naar de elementen in een matrix met behulp van een index. Plaats het indexnummer tussen vierkante haken. Indexwaarden beginnen bij 0. Als u bijvoorbeeld het first 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 de tweede tot vijfde elementen van de matrix wilt ophalen, typt u:

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

Negatieve getallen count vanaf het einde van de matrix. Verwijst bijvoorbeeld -1 naar het last element van de matrix. Als u de last drie elementen van de matrix wilt weergeven, typt u in oplopende indexvolgorde:

$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 dat wordt uitgegaan van $a[0..-2] alle elementen van de matrix, met uitzondering van de last ene. Het verwijst naar de first, lasten second-to-elementenlast in de matrix.

U kunt de plusoperator (+) 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 plusoperator gebruiken. Als u bijvoorbeeld elementen 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 over matrixelementen

U kunt ook lusconstructies gebruiken, zoals foreach, foren 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 until die het einde van de matrix bereikt.

De for lus 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 until weer te geven waarvoor een gedefinieerde voorwaarde niet meer geldt. 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

Countof LengthLongLength

Als u wilt bepalen hoeveel items zich in een matrix bevinden, gebruikt u de eigenschap of Count de Length alias ervan. Longlength is handig als de matrix meer dan 2.147.483.647 elementen bevat.

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

Rank

Geeft als resultaat het aantal dimensies in de matrix. De meeste matrices in PowerShell hebben slechts één dimensie. Zelfs als u denkt dat u een multidimensionale matrix bouwt, zoals in het volgende voorbeeld:

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

"`$a rank: $($a.Rank)"
"`$a length: $($a.Length)"
"`$a[2] length: $($a[2].Length)"
"Process `$a[2][1]: $($a[2][1].ProcessName)"

In dit voorbeeld maakt u een enkelvoudige matrix die andere matrices bevat. Dit wordt ook wel een gelabelde matrix genoemd. De Rank eigenschap heeft aangetoond dat dit ééndimensionaal is. Als u toegang wilt krijgen tot items in een gelabelde matrix, moeten de indexen tussen afzonderlijke haken ([]) staan.

$a rank: 1
$a length: 3
$a[2] length: 348
Process $a[2][1]: AcroRd32

Multidimensionale matrices worden opgeslagen in rijvolgorde. In het volgende voorbeeld ziet u hoe u een echt multidimensionale matrix maakt.

[string[,]]$rank2 = [string[,]]::New(3,2)
$rank2.rank
$rank2.Length
$rank2[0,0] = 'a'
$rank2[0,1] = 'b'
$rank2[1,0] = 'c'
$rank2[1,1] = 'd'
$rank2[2,0] = 'e'
$rank2[2,1] = 'f'
$rank2[1,1]
2
6
d

Als u toegang wilt krijgen tot items in een multidimensionale matrix, scheidt u de indexen met behulp van een komma (,) binnen één set vierkante haken ([]).

Voor sommige bewerkingen op een multidimensionale matrix, zoals replicatie en samenvoeging, moet die matrix worden afgevlakt. Door afvlakken wordt de matrix omgezet in een 1dimensionale matrix van niet-getraind type. De resulterende matrix neemt alle elementen in rij-primaire volgorde over. Kijk een naar het volgende voorbeeld:

$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
$a.GetType().Name
$b.GetType().Name
$c.GetType().Name
$c

In de uitvoer ziet u dat $c het een 1-dimensionale matrix is met de items uit $a en $b in rij-primaire volgorde.

Object[]
Int32[,]
Object[]
red
True
10
20
30
40

Methoden van matrices

Clear

Hiermee stelt u alle elementwaarden in op de default waarde van het elementtype van de matrix. De Clear() methode stelt de grootte van de matrix niet opnieuw in.

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 dat gehele getallen bevat.

[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(scriptblock expression, object[] arguments)
ForEach(type convertToType)
ForEach(string propertyName)
ForEach(string propertyName, object[] newValue)
ForEach(string methodName)
ForEach(string methodName, object[] arguments)

ForEach(scriptblock-expressie)

ForEach(scriptblock-expressie, object[]-argumenten)

Deze methode is toegevoegd in PowerShell v4.

Notitie

De syntaxis vereist het gebruik van een scriptblok. Haakjes zijn optioneel als het scriptblok de enige parameter is. Er mag ook geen spatie zijn tussen de methode en het haakje openen of accolade.

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.

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

Net als de parameter ArgumentList , ForEach-Objectstaat de arguments parameter het doorgeven van een matrix met argumenten toe aan een scriptblok dat is geconfigureerd om deze te accepteren.

Zie about_Splatting voor meer informatie over het gedrag van ArgumentList.

ForEach(type convertToType)

De ForEach() methode kan worden gebruikt om de elementen naar een ander type te casten. In het volgende voorbeeld ziet u hoe u een lijst met tekenreeksdatums converteert naar een [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(string propertyName)

ForEach(string propertyName, object[] newValue)

De ForEach() methode kan ook worden gebruikt om 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)

ForEach() Ten slotte kunnen methoden worden gebruikt om een methode uit te voeren voor elk item in de verzameling.

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

Net zoals de parameter ArgumentList , ForEach-Objectstaat de arguments parameter het doorgeven van een matrix met waarden toe aan een scriptblok dat is geconfigureerd om deze te accepteren.

Notitie

Vanaf Windows PowerShell 3.0 kunnen eigenschappen worden opgehaald en methoden voor elk item in een verzameling worden uitgevoerd met behulp van 'Methoden van scalaire objecten en verzamelingen'. U kunt hier meer over lezen about_Methods.

Where()

Hiermee kunt u de elementen van de matrix filteren of selecteren. Het script moet resulteren in iets anders dan: nul (0), lege tekenreeks of $false $null voor het element dat na het Where()element moet worden weergegeven. Zie about_Booleans voor meer informatie over booleaanse evaluatie.

Er is één definitie voor de Where() methode.

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

Notitie

De syntaxis vereist het gebruik van een scriptblok. Haakjes zijn optioneel als het scriptblok de enige parameter is. Er mag ook geen spatie zijn tussen de methode en het haakje openen of accolade.

Het Expression is een scriptblok dat is vereist voor filteren, het mode optionele argument biedt extra selectiemogelijkheden en het numberToReturn optionele argument maakt het mogelijk om te beperken hoeveel items worden geretourneerd uit het filter.

De waarde van mode moet een WhereOperatorSelectionMode-enumwaarde zijn:

  • Default (0) - Alle items retourneren
  • First(1) - Het item retourneren first
  • Last(2) - Het item retourneren last
  • SkipUntil (3) - De voorwaarde items until overslaan is waar, retourneert alle resterende items (inclusief het first item waarvoor de voorwaarde waar is)
  • Until (4) - Retourneer alle items until voorwaarde is waar
  • Split (5) - Retourneer een matrix van twee elementen
    • Het first element bevat overeenkomende items
    • Het tweede element bevat de resterende items

In het volgende voorbeeld ziet u hoe u alle oneven getallen uit de matrix selecteert.

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

In het volgende voorbeeld ziet u hoe u alle niet-lege tekenreeksen selecteert.

('hi', '', 'there').Where{ $_ }
hi
there

Default

De Default modus filtert items met behulp van het Expression scriptblok.

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 first (numberToReturn) items en kunnen door elkaar worden gebruikt.

Last

$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 until overgeslagen die door een object worden doorgegeven aan het filter voor scriptblokexpressie. Vervolgens worden ALLE resterende verzamelingsitems geretourneerd zonder ze te testen. Er wordt slechts één geslaagd 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

Until

Met Until de modus wordt de SkipUntil modus omgekeerd. Hiermee worden ALLE items in een verzameling until geretourneerd die een item doorgeeft aan de scriptblokexpressie. Zodra een item de scriptblock-expressie doorgeeft , stopt de methode met het Where() verwerken van items.

Dit betekent dat u de first set niet-doorgegeven items van de Where() methode ontvangt. Nadat één item is verstreken, 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

Beide Until en SkipUntil werken onder het uitgangspunt van HET NIET testen van een batch met items.

Until retourneert de items VÓÓR de firstPASS. SkipUntil retourneert alle items NA de firstpas, inclusief het first doorgevende item.

Split

De Split modus splitst of groepeert verzamelingsitems in twee afzonderlijke verzamelingen. Degenen die de scriptblock-expressie doorgeven en de expressies die dat niet doen.

Als een numberToReturn waarde is opgegeven, bevat de first verzameling de doorgegeven items, niet om de opgegeven waarde te overschrijden.

De resterende objecten, zelfs 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
...

Notitie

Where() Zowel als ForEach() methoden zijn intrinsieke leden. Zie about_Intrinsic_Members voor meer informatie over intrinsieke leden.

De leden van een matrix ophalen

Als u de eigenschappen en methoden van een matrix wilt ophalen, zoals de Length eigenschap en de methode SetValue , gebruikt u de parameter InputObject van de Get-Member cmdlet.

Wanneer u een matrix doorstuurt Get-Member, verzendt PowerShell de items één voor één en Get-Member retourneert het type van elk item in de matrix (dubbele waarden negeren).

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 ook de leden van een matrix ophalen door een komma (,) te typen voordat de waarde naar de Get-Member cmdlet wordt doorgesluisd. De komma maakt de matrix het tweede item in een matrix met matrices. PowerShell pijpt de matrices één voor één en Get-Member retourneert de leden van de matrix. Zoals 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 in 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 daadwerkelijk 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 de grootte van de matrix te groot is.

Het is niet eenvoudig om elementen uit een matrix te verwijderen, maar u kunt 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 in één matrix wilt combineren, 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 toe $null 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 $null een waarde is sneller, met name voor grote matrices.

Matrices van nul of één

Vanaf Windows PowerShell 3.0 heeft een verzameling nul of één object de Count en Length eigenschappen. U kunt ook indexeren in een matrix van één object. Met deze functie kunt u scriptfouten voorkomen die optreden wanneer een opdracht die verwacht dat een verzameling minder dan twee items krijgt.

In het volgende voorbeeld ziet u dat een variabele die geen objecten bevat een Count en Length van 0 heeft.

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

In het volgende voorbeeld ziet u dat een variabele die één object bevat een Count en Length van 1 heeft. U kunt matrixindexering ook gebruiken om toegang te krijgen tot de waarde van het object.

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

Wanneer u een opdracht uitvoert die een verzameling of één object kan retourneren, kunt u matrixindexering gebruiken om toegang te krijgen tot de waarde van het object zonder dat u de Count of Length eigenschappen hoeft te testen. Als het resultaat echter één object (singleton) is en dat object een Count of Length eigenschap heeft, behoort de waarde van deze eigenschappen tot het singleton-object en vertegenwoordigt het aantal items in de verzameling niet.

In het volgende voorbeeld retourneert de opdracht één tekenreeksobject. De Length tekenreeks is 4.

PS> $result = 'one','two','three','four' | Where-Object {$_ -like 'f*'}
PS> $result.GetType().FullName
System.String
PS> $result
four
PS> $result.Count
1
PS❯ $result.Length
4

Als u een matrix met tekenreeksen wilt $result zijn, moet u de variabele declareren als een matrix.

In dit voorbeeld $result is een matrix met tekenreeksen. De Count en Length van de matrix is 1, en het Length element first is 4.

PS> [string[]]$result = 'one','two','three','four' |
    Where-Object {$_ -like 'f*'}
PS> $result.GetType().FullName
System.String[]
PS> $result
four
PS> $result.Count
1
PS> $result.Length
1
PS> $result[0].Length
4

Indexeringsondersteuning voor System.Tuple Objecten

PowerShell 6.1 heeft de ondersteuning toegevoegd voor geïndexeerde toegang tot Tuple objecten, vergelijkbaar met matrices. Voorbeeld:

PS> $tuple = [Tuple]::Create(1, 'test')
PS> $tuple[0]
1
PS> $tuple[1]
test
PS> $tuple[0..1]
1
test
PS> $tuple[-1]
test

In tegenstelling tot matrices en andere verzamelingsobjecten worden Tuple objecten behandeld als één object wanneer ze worden doorgegeven via de pijplijn of door parameters die matrices van objecten ondersteunen.

Zie System voor meer informatie.Tuple

.NET-typen indexeren die worden geïmplementeerd IDictionary<TKey, TValue>

PowerShell roept geen echte indexeerfunctie van een type aan voor typen die de algemene IDictionary<TKey, TValue> interface implementeren. Wanneer u een sleutel krijgt, test PowerShell in plaats daarvan op het bestaan van de sleutel die wordt gebruikt TryGetValue(), wat retourneert $null wanneer de sleutel niet bestaat.

Als u daarentegen de echte indexeerfunctie van het type aanroept Item(<key>), genereert de methode een uitzondering wanneer de sleutel niet bestaat.

In het volgende voorbeeld ziet u het verschil.

PS> [Collections.Generic.Dictionary[string, int]]::new()['nosuchkey']
# No output ($null)

PS> [Collections.Generic.Dictionary[string, int]]::new().Item('nosuchkey')
GetValueInvocationException: Exception getting "Item": "The given key 'nosuchkey'
 was not present in the dictionary."

Opsomming voor lidtoegang

Wanneer u in PowerShell 3.0 de operator voor lidtoegang gebruikt om toegang te krijgen tot een lid dat niet bestaat in een lijstverzameling, wordt in PowerShell automatisch de items in de verzameling opgesomd en wordt geprobeerd het opgegeven lid voor elk item te openen. Zie about_Member-Access_Enumeration voor meer informatie.

Voorbeelden

In het volgende voorbeeld worden twee nieuwe bestanden gemaakt en worden de resulterende objecten opgeslagen in de matrixvariabele $files. Omdat het matrixobject niet het lid LastWriteTime heeft, wordt de waarde van LastWriteTime geretourneerd voor elk item in de matrix.

$files = (New-Item -Type File -Force '/temp/t1.txt'),
         (New-Item -Force -Type File '/temp/t2.txt')
$files.LastWriteTime
Friday, June 25, 2021 1:21:17 PM
Friday, June 25, 2021 1:21:17 PM

Met opsomming voor lidtoegang kunt u waarden ophalen uit items in een verzameling, maar u kunt geen waarden instellen voor items in een verzameling. Voorbeeld:

$files.LastWriteTime = (Get-Date).AddDays(-1)
InvalidOperation: The property 'LastWriteTime' cannot be found on this object.
Verify that the property exists and can be set.

Als u de waarden wilt instellen, moet u een methode gebruiken.

$files.set_LastWriteTime((Get-Date).AddDays(-1))
$files.LastWriteTime
Thursday, June 24, 2021 1:23:30 PM
Thursday, June 24, 2021 1:23:30 PM

De set_LastWriteTime() methode is een verborgen lid van het FileInfo-object . In het volgende voorbeeld ziet u hoe u verborgen set methoden kunt vinden.

$files | Get-Member -Force -Name set_*
   TypeName: System.IO.FileInfo

Name              MemberType Definition
----              ---------- ----------
Attributes        Property   System.IO.FileAttributes Attributes {get;set;}
CreationTime      Property   datetime CreationTime {get;set;}
CreationTimeUtc   Property   datetime CreationTimeUtc {get;set;}
IsReadOnly        Property   bool IsReadOnly {get;set;}
LastAccessTime    Property   datetime LastAccessTime {get;set;}
LastAccessTimeUtc Property   datetime LastAccessTimeUtc {get;set;}
LastWriteTime     Property   datetime LastWriteTime {get;set;}
LastWriteTimeUtc  Property   datetime LastWriteTimeUtc {get;set;}

Let op

Omdat de methode wordt uitgevoerd voor elk item in de verzameling, moet u ervoor zorgen dat u methoden aanroept met behulp van lid-inventarisatie.

Zie ook