Sdílet prostřednictvím


about_Arrays

Krátký popis

Popisuje pole, což jsou datové struktury navržené k ukládání kolekcí položek.

Dlouhý popis

Pole je datová struktura navržená k uložení kolekce položek. Položky můžou být stejného typu nebo různé typy.

Počínaje windows PowerShellem 3.0 má kolekce nula nebo jednoho objektu některé vlastnosti polí.

Vytvoření a inicializace pole

Pokud chcete vytvořit a inicializovat pole, přiřaďte proměnné více hodnot. Hodnoty uložené v poli jsou oddělené čárkou a oddělují se od názvu proměnné operátorem přiřazení (=).

Pokud chcete například vytvořit matici s názvem $A obsahující sedm číselných hodnot (celé číslo) 22, 5, 10, 8, 12, 9 a 80, zadejte:

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

Čárku lze také použít k inicializaci pole jedné položky umístěním čárky před jedinou položku.

Pokud chcete například vytvořit pole s jednou položkou s názvem $B obsahující jedinou hodnotu 7, zadejte:

$B = ,7

Pomocí operátoru rozsahu (..) můžete také vytvořit a inicializovat pole. Následující příklad vytvoří pole obsahující hodnoty 5 až 8.

$C = 5..8

V důsledku toho $C obsahuje čtyři hodnoty: 5, 6, 7 a 8.

Pokud není zadán žádný datový typ, PowerShell vytvoří každé pole jako pole objektů (System.Object[]). K určení datového typu pole použijte metodu GetType(). Například:

$A.GetType()

Chcete-li vytvořit pole silného typu, to znamená pole, které může obsahovat pouze hodnoty určitého typu, přetypovat proměnnou jako typ pole, například řetězec[], long[]nebo int32[]. Pokud chcete přetypovat pole, před název proměnné zadejte typ pole uzavřený v hranatých závorkách. Například:

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

V důsledku toho může pole $ia obsahovat pouze celá čísla.

V rozhraní .NET můžete vytvořit pole přetypovaná na libovolný podporovaný typ. Například objekty, které Get-Process načte, aby představovaly procesy, jsou typu System.Diagnostics.Process. Chcete-li vytvořit pole objektů procesu silného typu, zadejte následující příkaz:

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

Operátor dílčího výrazu pole

Operátor dílčího výrazu pole vytvoří pole z příkazů uvnitř. Bez ohledu na to, co příkaz uvnitř operátoru vytvoří, operátor ho umístí do pole. I v případě, že existuje žádný nebo jeden objekt.

Syntaxe operátoru pole je následující:

@( ... )

Pomocí operátoru pole můžete vytvořit matici nuly nebo jednoho objektu. Například:

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

Operátor pole je užitečný ve skriptech, když získáváte objekty, ale nevíte, kolik očekáváte. Například:

$p = @(Get-Process Notepad)

Další informace o operátoru dílčího výrazu pole naleznete v tématu about_Operators.

Přístup k prvkům pole a jejich používání

Čtení pole

Pole můžete odkazovat pomocí názvu proměnné. Pokud chcete zobrazit všechny prvky v poli, vyvolejte název pole. Například $a je matice čísel 0 až 9:

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

Pomocí indexu můžete odkazovat na prvky v poli. Uzavřete číslo indexu do závorek. Hodnoty indexu začínají na 0. Pokud chcete například zobrazit první prvek v poli $a, zadejte:

$a[0]
0

Pokud chcete zobrazit třetí prvek v poli $a, zadejte:

$a[2]
2

Část pole můžete načíst pomocí operátoru rozsahu indexu. Pokud například chcete načíst druhý až pátý prvek pole, zadejte:

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

Záporná čísla se počítají od konce pole. Například -1 odkazuje na poslední prvek pole. Pokud chcete zobrazit poslední tři prvky pole, zadejte ve vzestupném pořadí indexu:

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

Pokud zadáte záporné indexy v sestupném pořadí, výstup se změní.

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

Při použití tohoto zápisu však buďte opatrní. Notační cykly od koncové hranice k začátku pole.

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

Jednou z běžných chyb je také předpokládat, $a[0..-2] odkazuje na všechny prvky pole s výjimkou poslední chyby. Odkazuje na první, poslední a druhý prvek v poli.

Operátor plus (+) můžete použít ke kombinování oblastí se seznamem prvků v poli. Pokud chcete například zobrazit prvky na pozicích indexu 0, 2 a 4 až 6, zadejte:

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

Pokud chcete vypsat více oblastí a jednotlivých prvků, můžete také použít operátor plus. Pokud chcete například vypsat prvky nuly na dvě, čtyři až šest a prvek v osmém pozičním typu:

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

Iterace nad prvky pole

Pomocí konstruktorů smyčky, jako jsou foreach, fora while smyčky, můžete odkazovat na prvky v poli. Pokud chcete například použít smyčku foreach k zobrazení prvků v poli $a, zadejte:

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

Smyčka foreach prochází matici a vrací každou hodnotu v matici, dokud nedosáhne konce pole.

Smyčka for je užitečná při zvyšování čítačů při zkoumání prvků v poli. Pokud chcete například použít smyčku for k vrácení všech ostatních hodnot v poli, zadejte:

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

Smyčku while můžete použít k zobrazení prvků v poli, dokud není definovaná podmínka pravdivá. Pokud chcete například zobrazit prvky v poli $a, zatímco index pole je menší než 4, zadejte:

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

Vlastnosti polí

Count nebo Length nebo LongLength

V PowerShellu mají pole tři vlastnosti, které označují počet položek obsažených v poli.

  • Count – tato vlastnost je nejčastěji používanou vlastností k určení počtu položek v libovolné kolekci, nejen pole. Jedná se o hodnotu typu [int32]. Ve windows PowerShellu 5.1 (a starší) Count vlastnost aliasu pro Length.

  • Length – Tato vlastnost je hodnota typu [int32]. Obsahuje stejnou hodnotu jako Count.

    Poznámka

    I když Count a Length jsou ekvivalentní pro pole, Length může mít jiný význam pro jiné typy. Například Length pro řetězec je počet znaků v řetězci. Ale vlastnost Count je vždy 1.

  • LongLength – Tato vlastnost je hodnota typu [int64]. Tuto vlastnost použijte pro pole obsahující více než 2 147 483 647 prvků.

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

Rank

Vrátí počet dimenzí v matici. Většina polí v PowerShellu má pouze jednu dimenzi. I když si myslíte, že vytváříte multidimenzionální pole jako v následujícím příkladu:

$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)"

V tomto příkladu vytváříte jednorozměrné pole, které obsahuje další pole. To se také označuje jako jagged array. Rank vlastnost prokázala, že se jedná o jednorozměrný. Pokud chcete získat přístup k položkám v polích, musí být indexy v samostatných hranatých závorkách ([]).

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

Multidimenzionální pole jsou uložena v pořadí hlavního řádku. Následující příklad ukazuje, jak vytvořit skutečně multidimenzionální pole.

[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

Pokud chcete získat přístup k položkám v multidimenzionálním poli, oddělte indexy pomocí čárky (,) v rámci jedné sady hranatých závorek ([]).

Některé operace s multidimenzionálním polem, jako je replikace a zřetězení, vyžadují, aby bylo pole zploštěno. Zploštění změní matici na 1rozměrné pole nekontrénovaného typu. Výsledné pole přebírá všechny prvky v pořadí hlavního řádku. Podívejte se na následující příklad:

$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

Výstup ukazuje, že $c je 1rozměrné pole obsahující položky z $a a $b v pořadí hlavního řádku.

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

Metody polí

Clear

Nastaví všechny hodnoty prvků na výchozí hodnotu typu prvku pole. Metoda Clear() neobnovuje velikost pole.

V následujícím příkladu $a je pole objektů.

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

V tomto příkladu je $intA explicitně zadána tak, aby obsahovala celá čísla.

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

ForEach()

Umožňuje iterovat všechny prvky v poli a provést danou operaci pro každý prvek pole.

Metoda ForEach() má několik přetížení, která provádějí různé operace.

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)

PowerShell 7.6-preview.5 byl přidán PSForEach() jako alias pro metodu ForEach() a PSWhere() jako alias metody Where() . Pomocí těchto aliasů se vyhnete konfliktům ForEach() a Where() které mohou být definovány v základní třídě objektu. Třída například System.Collections.Generic.List<T> definuje vlastní ForEach() metodu. Slouží PSForEach() k zabránění volání metody základní třídy.

ForEach(výraz scriptblock)

ForEach(výraz scriptblock, argumenty object[]

Tato metoda byla přidána v PowerShellu v4.

Poznámka

Syntaxe vyžaduje použití skriptublock. Závorky jsou volitelné, pokud je skriptblock jediným parametrem. Nesmí existovat mezera mezi metodou a levou závorkou nebo složenou závorkou.

Následující příklad ukazuje, jak použít ForEach() metoda. V tomto případě je záměrem vygenerovat druhou hodnotu prvků v poli.

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

Stejně jako parametr ArgumentList parametru ForEach-Objectarguments umožňuje předání pole argumentů do skriptu, který je nakonfigurován tak, aby je přijímal.

Další informace o chování ArgumentListnaleznete v tématu about_Splatting.

ForEach(typ convertToType)

Metodu ForEach() lze použít k přetypování prvků na jiný typ; Následující příklad ukazuje, jak převést seznam řetězcových kalendářních dat na [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(název vlastnosti řetězce)

ForEach(string propertyName, object[] newValue)

Metodu ForEach() lze také použít k načtení nebo nastavení hodnot vlastností pro každou položku v kolekci.

# 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[] argumenty)

Nakonec ForEach() metody lze použít ke spuštění metody pro každou položku v kolekci.

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

Stejně jako parametr ArgumentList parametru ForEach-Objectarguments umožňuje předání pole hodnot do skriptu, který je nakonfigurován tak, aby je přijímal.

Poznámka

Počínaje windows PowerShellem 3.0 načítáním vlastností a spouštěním metod pro každou položku v kolekci lze také dosáhnout pomocí metod skalárních objektů a kolekcí. Můžete si přečíst více o tom zde about_Methods.

Where()

Umožňuje filtrovat nebo vybírat prvky pole. Skript musí vyhodnotit cokoli jiného než nula (0), prázdný řetězec, $false nebo $null, aby se prvek zobrazil za Where(). Další informace o logickém vyhodnocení najdete v tématu about_Booleans.

Pro metodu Where() existuje jedna definice.

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

Poznámka

Syntaxe vyžaduje použití skriptublock. Závorky jsou volitelné, pokud je skriptblock jediným parametrem. Nesmí existovat mezera mezi metodou a levou závorkou nebo složenou závorkou.

Expression je blok skriptu, který je nutný pro filtrování, mode volitelný argument umožňuje další možnosti výběru a numberToReturn volitelný argument umožňuje omezit počet vrácených položek z filtru.

Hodnota mode musí být WhereOperatorSelectionMode výčtu:

  • Default (0) – Vrátí všechny položky.
  • First (1) – vrátí první položku.
  • Last (2) – vrátí poslední položku.
  • SkipUntil (3) – Přeskočte položky, dokud není podmínka pravdivá, vrátí všechny zbývající položky (včetně první položky, pro kterou je podmínka pravdivá).
  • Until (4) – vrátí všechny položky, dokud není podmínka pravdivá.
  • Split (5) – vrátí pole dvou prvků.
    • První prvek obsahuje odpovídající položky.
    • Druhý prvek obsahuje zbývající položky.

Následující příklad ukazuje, jak vybrat všechna lichá čísla z pole.

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

Další příklad ukazuje, jak vybrat všechny neprázdné řetězce.

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

PowerShell 7.6-preview.5 byl přidán PSForEach() jako alias pro metodu ForEach() a PSWhere() jako alias metody Where() . Pomocí těchto aliasů se vyhnete konfliktům ForEach() a Where() které mohou být definovány v základní třídě objektu. Třída například System.Collections.Generic.List<T> definuje vlastní ForEach() metodu. Slouží PSForEach() k zabránění volání metody základní třídy.

Default

Režim Default filtruje položky pomocí bloku skriptu Expression.

Pokud je zadán numberToReturn, určuje maximální počet položek, které se mají vrátit.

# 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)

Poznámka

Režim Default i režim First vrátí první (numberToReturn) položky a lze je použít zaměnitelně.

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

Režim SkipUntil přeskočí všechny objekty v kolekci, dokud objekt nepřejde filtr výrazu scriptblock. Pak vrátí VŠECHNY zbývající položky kolekce bez jejich testování. testuje sepouze jedna předávací položka .

To znamená, že vrácená kolekce obsahuje předávání i nepředávky položek, které nebyly testovány.

Počet vrácených položek může být omezen předáním hodnoty numberToReturn argumentu.

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

Until

Režim Until invertuje režim SkipUntil. Vrátí všechny položky v kolekci, dokud položka nepřejde výraz scriptblock. Jakmile položka předá výraz scriptblock, metoda Where() přestane zpracovávat položky.

To znamená, že obdržíte první sadu nepředávejte položky z Where() metody. Po průchodu jednou položkou se zbytek NE otestování nebo vrácení.

Počet vrácených položek může být omezen předáním hodnoty numberToReturn argumentu.

# 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

Poznámka

Obě Until i SkipUntil fungují v rámci místního testování netestování dávky položek.

Until vrátí položky PŘED první PASS. SkipUntil vrátí všechny položky PO první předat, včetně první předávací položky.

Split

Režim Split rozdělí nebo seskupí položky kolekce do dvou samostatných kolekcí. Ty, které předají výraz scriptblock a ty, které ne.

Pokud je zadán numberToReturn, první kolekce obsahuje předávání položek, aby nepřekročila zadanou hodnotu.

Zbývající objekty, i ty, které PASS filtru výrazů, se vrátí ve druhé kolekci.

$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
...

Poznámka

Vnitřní členy jsou ForEach() i metody Where(). Další informace o vnitřních členech naleznete v tématu about_Intrinsic_Members.

Získání členů pole

K získání vlastností a metod pole, jako je například Length vlastnost a metoda SetValue, použijte parametr InputObject rutiny Get-Member.

Když předáte pole do Get-Member, PowerShell odešle položky po jednom a Get-Member vrátí typ každé položky v poli (ignoruje duplicity).

Pokud použijete parametr InputObject, Get-Member vrátí členy pole.

Následující příkaz například získá členy proměnné pole $a.

Get-Member -InputObject $a

Členy pole můžete získat také zadáním čárky (,) před hodnotou, která je předsaná do rutiny Get-Member. Čárka vytvoří matici jako druhou položku v matici polí. PowerShell řadí pole po jednom a Get-Member vrátí členy pole. Podobně jako v následujících dvou příkladech.

,$a | Get-Member

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

Manipulace s polem

Můžete změnit prvky v matici, přidat prvek do pole a zkombinovat hodnoty ze dvou polí do třetí matice.

Pokud chcete změnit hodnotu určitého prvku v poli, zadejte název pole a index prvku, který chcete změnit, a potom pomocí operátoru přiřazení (=) zadejte novou hodnotu prvku. Pokud chcete například změnit hodnotu druhé položky v poli $a (pozice indexu 1) na 10, zadejte:

$a[1] = 10

Hodnotu můžete změnit také pomocí SetValue metody pole. Následující příklad změní druhou hodnotu (pozici indexu 1) pole $a na 500:

$a.SetValue(500,1)

Pomocí operátoru += můžete přidat prvek do pole. Následující příklad ukazuje, jak přidat prvek do pole $a.

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

Poznámka

Když použijete operátor +=, PowerShell ve skutečnosti vytvoří nové pole s hodnotami původního pole a přidanou hodnotou. To může způsobit problémy s výkonem, pokud se operace několikrát opakuje nebo je velikost pole příliš velká.

Není snadné odstranit prvky z pole, ale můžete vytvořit novou matici, která obsahuje pouze vybrané prvky existujícího pole. Pokud chcete například vytvořit pole $t se všemi prvky v poli $a s výjimkou hodnoty na pozici indexu 2, zadejte:

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

Pokud chcete zkombinovat dvě matice do jedné matice, použijte operátor plus (+). Následující příklad vytvoří dvě pole, zkombinuje je a zobrazí výslednou kombinovanou matici.

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

Výsledkem je, že pole $z obsahuje 1, 3, 5 a 9.

Pokud chcete pole odstranit, přiřaďte matici hodnotu $null. Následující příkaz odstraní pole v proměnné $a.

$a = $null

Můžete také použít Remove-Item rutinu, ale přiřazení hodnoty $null je rychlejší, zejména u rozsáhlých polí.

Matice s nulovou nebo jednou

Počínaje Windows PowerShellem 3.0 má skalární typy a kolekce nulových nebo jednoho objektu Count a Length vlastnosti. K přístupu k hodnotě jednosloupkového skalárního objektu můžete také použít zápis indexu pole. Tato funkce vám pomůže vyhnout se chybám skriptování, ke kterým dochází, když příkaz, který očekává kolekci, získá méně než dvě položky.

Následující příklad ukazuje, že proměnná, která neobsahuje žádné objekty, má Count a Length 0.

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

Následující příklad ukazuje, že proměnná, která obsahuje jeden objekt, má Count a Length 1. Indexování pole můžete použít také pro přístup k hodnotě objektu.

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

Když spustíte příkaz, který by mohl vrátit kolekci nebo jeden objekt, můžete použít indexování pole pro přístup k hodnotě objektu, aniž byste museli testovat Count nebo Length vlastnosti. Pokud je však výsledkem jeden objekt (singleton) a tento objekt má Count nebo Length vlastnost, hodnota těchto vlastností patří do objektu singleton a nepředstavuje počet položek v kolekci.

V následujícím příkladu příkaz vrátí jeden objekt řetězce. Length tohoto řetězce je 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

Pokud chcete $result být polem řetězců, musíte proměnnou deklarovat jako pole.

V tomto příkladu je $result pole řetězců. Count a Length pole je 1a Length prvního prvku je 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

Podpora indexování pro systém.Tuple objekty

PowerShell 6.1 přidal podporu indexovaného přístupu Tuple objektů, podobně jako pole. Například:

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

Na rozdíl od polí a jiných objektů kolekce se objekty Tuple při předávání kanálem nebo parametry podporujícími pole objektů považují za jeden objekt.

Další informace naleznete v tématu System.Tuple.

Indexování typů .NET, které implementují IDictionary<TKey, TValue>

PowerShell nevolá skutečný indexer typu pro typy, které implementují obecné rozhraní IDictionary<TKey, TValue>. Místo toho PowerShell při zadání klíče otestuje existenci klíče pomocí TryGetValue(), který vrátí $null, pokud klíč neexistuje.

Pokud naopak zavoláte true indexer typu pomocí Item(<key>), metoda vyvolá výjimku, pokud klíč neexistuje.

Následující příklad znázorňuje rozdíl.

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."

Výčet přístupu členů

Počínaje PowerShellem 3.0 použijete operátor přístupu člena pro přístup k členu, který v kolekci seznamů neexistuje, PowerShell automaticky vytvoří výčet položek v kolekci a pokusí se získat přístup k zadanému členu v každé položce. Další informace naleznete v tématu about_Member-Access_Enumeration.

Příklady

Následující příklad vytvoří dva nové soubory a uloží výsledné objekty do proměnné pole $files. Vzhledem k tomu, že maticový objekt nemá člen LastWriteTime, vrátí se hodnota LastWriteTime pro každou položku v poli.

$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

Výčet přístupu členů umožňuje získat hodnoty z položek v kolekci, ale ne nastavit hodnoty u položek v kolekci. Například:

$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.

K nastavení hodnot musíte použít metodu.

$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

Metoda set_LastWriteTime() je skrytý člen FileInfo objektu. Následující příklad ukazuje, jak najít skryté metodyset.

$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;}

Opatrnost

Vzhledem k tomu, že metoda se provádí pro každou položku v kolekci, je třeba při volání metod pomocí výčtu členů věnovat pozornost.

Viz také