about_Member-Access_Enumeration

Krátký popis

Popisuje automatický výčet položek kolekce seznamů při použití operátoru přístupu člena.

Dlouhý popis

Počínaje PowerShellem 3.0 vylepšuje funkce výčtu pro přístup členů k usnadnění používání operátoru přístupu člena (.) u objektů kolekce seznamů. Pokud pro přístup k členu, který v kolekci neexistuje, použijete operátor přístupu člena, PowerShell automaticky vytvoří výčet položek v kolekci a pokusí se získat přístup k zadanému členu pro každou položku.

Výčet přístupu členů vám pomůže psát jednodušší a kratší kód. Místo propojení objektu ForEach-Object kolekce nebo použití ForEach()vnitřní metody pro přístup ke členům u každé položky v kolekci můžete použít operátor přístupu člena v objektu kolekce.

Tyto příkazy jsou funkčně identické s posledním příkazem, který demonstruje použití operátoru přístupu člena:

Get-Service -Name event* | ForEach-Object -Process { $_.DisplayName }
(Get-Service -Name event*).ForEach({ $_.DisplayName })
(Get-Service -Name event*).DisplayName
Windows Event Log
COM+ Event System

Windows Event Log
COM+ Event System

Windows Event Log
COM+ Event System

Poznámka:

Pomocí operátoru přístupu člena můžete získat hodnoty vlastnosti u položek v kolekci, ale nemůžete ho použít k jejich přímému nastavení. Další informace najdete v tématu about_Arrays.

Pokud použijete operátor člen-přístup u libovolného objektu a zadaný člen existuje u daného objektu, je vyvolán člen. U členů vlastností vrátí operátor hodnotu této vlastnosti. Pro členy metody operátor volá danou metodu na objektu.

Pokud použijete operátor člen-přístup u objektu kolekce seznamu, který nemá zadaného člena, PowerShell automaticky vytvoří výčet položek v této kolekci a použije operátor přístupu člena pro každou položku výčtu.

Můžete zkontrolovat, jestli je objektem kolekce seznamů, a to tak, že zjistíte, jestli jeho typ implementuje rozhraní IList :

$List = @('a', 'b')
$Hash = @{ a = 'b' }
$List.GetType().ImplementedInterfaces.Name -contains 'IList'
$Hash.GetType().ImplementedInterfaces.Name -contains 'IList'
True

False

Během výčtu přístupu člena pro vlastnost vrátí operátor hodnotu vlastnosti pro každou položku, která má tuto vlastnost. Pokud žádné položky nemají zadanou vlastnost, vrátí operátor hodnotu $null.

Během výčtu přístupu člena pro metodu se operátor pokusí volat metodu pro každou položku v kolekci. Pokud některá položka v kolekci nemá zadanou metodu, vrátí operátor výjimku MethodNotFound .

Upozorňující

Během výčtu přístupu člena pro metodu je volána metoda pro každou položku v kolekci. Pokud metoda, kterou voláte, provede změny pro každou položku v kolekci. Pokud dojde k chybě během výčtu, metoda je volána pouze u položek výčtu před chybou. Pokud chcete větší bezpečnost, zvažte ruční výčet položek a explicitně zpracovávat případné chyby.

Následující příklady podrobně popisuje chování operátoru přístupu člena ve všech možných scénářích.

Přístup ke členům objektu, který není seznamem

Pokud použijete operátor člen-přístup k objektu, který není kolekcí seznamu a který má člen, příkaz vrátí hodnotu vlastnosti nebo výstupu metody pro tento objekt.

$MyString = 'abc'
$MyString.Length
$MyString.ToUpper()
3

ABC

Pokud použijete operátor člen-přístup u objektu, který nemá člena, příkaz vrátí $null , pokud zadáte vlastnost nebo MethodNotFound chyba, pokud zadáte metodu.

$MyString = 'abc'
$null -eq $MyString.DoesNotExist
$MyString.DoesNotExist()
True

InvalidOperation:
Line |
   3 |  $MyString.DoesNotExist()
     |  ~~~~~~~~~~~~~~~~~~~~~~~~
     | Method invocation failed because [System.String] does not contain a method named 'DoesNotExist'.

Přístup k členům objektu kolekce seznamů

Pokud použijete operátor člen-přístup u objektu kolekce, který má člen, vrátí vždy hodnotu vlastnosti nebo výsledek metody pro objekt kolekce.

Přístup k členům, kteří existují v kolekci, ale ne k jejím položkám

V tomto příkladu existují zadané členy v kolekci, ale ne položky v ní.

[System.Collections.Generic.List[string]]$Collection = @('a', 'b')
$Collection.IsReadOnly
$Collection.Add('c')
$Collection
False

a
b
c

Přístup k členům, kteří existují v kolekci a jejích položkách

V tomto příkladu existují zadané členy v kolekci i v položkách v něm. Porovnejte výsledky příkazů pomocí operátoru přístupu člena v kolekci k výsledkům z použití operátoru přístupu člena u položek kolekce v ForEach-Object. V kolekci vrátí operátor hodnotu vlastnosti nebo výsledek metody pro objekt kolekce, a ne položky v něm.

[System.Collections.Generic.List[string]]$Collection = @('a', 'b', 'c')
$Collection.Count
$Collection | ForEach-Object -Process { $_.Count }
$Collection.ToString()
$Collection | ForEach-Object -Process { $_.ToString() }
3

1
1
1

System.Collections.Generic.List`1[System.String]

a
b
c

Poznámka:

Kolekce, které implementují rozhraní System.Collections.IDictionary , například HashTable a OrderedDictionary, mají jiné chování. Pokud použijete operátor přístupu člena ve slovníku, který má klíč se stejným názvem jako vlastnost, vrátí hodnotu klíče místo vlastnosti.

K hodnotě vlastnosti objektu slovníku se dostanete pomocí vnitřního člena psbase. Pokud je keys například název klíče a chcete vrátit kolekci klíčů HashTable , použijte tuto syntaxi:

$hashtable.PSBase.Keys

Přístup ke členům, kteří existují u všech položek v kolekci, ale ne pro sebe

Pokud použijete operátor přístupu člena u objektu kolekce, který nemá člen, ale položky v něm provedené, PowerShell vytvoří výčet položek v kolekci a vrátí hodnotu vlastnosti nebo výsledek metody pro každou položku.

[System.Collections.Generic.List[string]]$Collection = @('a', 'b', 'c')
$Collection.Length
$Collection.ToUpper()
1
1
1

A
B
C

Přístup k členům, kteří existují v kolekci ani jejích položkách

Pokud použijete operátor člen-přístup u objektu kolekce, který nemá člena a ani položky v něm, příkaz vrátí $null , pokud zadáte vlastnost nebo MethodNotFound chybu, pokud zadáte metodu.

[System.Collections.Generic.List[string]]$Collection = @('a', 'b', 'c')
$null -eq $Collection.DoesNotExist
$Collection.DoesNotExist()
True

InvalidOperation:
Line |
   3 |  $Collection.DoesNotExist()
     |  ~~~~~~~~~~~~~~~~~~~~~~~~~~
     | Method invocation failed because [System.String] does not contain a method named 'DoesNotExist'.

Vzhledem k tomu, že objekt kolekce nemá člena, PowerShell vyčíslil položky v kolekci. Všimněte si, že chyba MethodNotFound určuje, že System.String neobsahuje metodu namísto System.Collections.Generic.List.

Přístup k metodám, které existují pouze u některých položek v kolekci

Pokud použijete operátor přístupu člena pro přístup k metodě v objektu kolekce, který nemá metodu a pouze některé položky v kolekci mají, příkaz vrátí MethodNotFound chybu pro první položku v kolekci, která nemá metodu. I když se metoda volá u některých položek, příkaz vrátí pouze chybu.

@('a', 1, 'c').ToUpper()
InvalidOperation: Method invocation failed because [System.Int32] does not contain a method named 'ToUpper'.

Přístup k vlastnostem, které existují pouze u některých položek v kolekci

Když použijete operátor přístupu člena pro přístup k vlastnosti objektu kolekce, který nemá vlastnost a pouze některé položky v kolekci mají, příkaz vrátí hodnotu vlastnosti pro každou položku v kolekci, která má vlastnost.

$CapitalizedProperty = @{
    MemberType = 'ScriptProperty'
    Name       = 'Capitalized'
    Value      = { $this.ToUpper() }
    PassThru   = $true
}
[System.Collections.Generic.List[object]]$MixedCollection = @(
    'a'
    ('b' | Add-Member @CapitalizedProperty)
    ('c' | Add-Member @CapitalizedProperty)
    'd'
)
$MixedCollection.Capitalized
B
C

Viz také