about_Member-Access_Enumeration

Descrizione breve

Descrive l'enumerazione automatica degli elementi della raccolta di elenchi quando si usa l'operatore member-access.

Descrizione lunga

A partire da PowerShell 3.0, la funzionalità di enumerazione di accesso ai membri migliora la praticità dell'uso dell'operatore di accesso ai membri (.) negli oggetti raccolta elenchi. Quando si usa l'operatore di accesso ai membri per accedere a un membro che non esiste in una raccolta, PowerShell enumera automaticamente gli elementi nella raccolta e tenta di accedere al membro specificato in ogni elemento.

L'enumerazione Di accesso ai membri consente di scrivere codice più semplice e più breve. Anziché eseguire il piping di un oggetto raccolta a ForEach-Object o utilizzando il ForEach()metodo intrinseco per accedere ai membri di ogni elemento dell'insieme, è possibile utilizzare l'operatore di accesso ai membri nell'oggetto raccolta.

Questi comandi sono funzionalmente identici all'ultimo che dimostra l'uso dell'operatore member-access:

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

Nota

È possibile usare l'operatore di accesso ai membri per ottenere i valori di una proprietà sugli elementi di una raccolta, ma non è possibile usarli direttamente per impostarli direttamente. Per altre informazioni, vedere about_Arrays.

Quando si utilizza l'operatore di accesso ai membri su qualsiasi oggetto e il membro specificato esiste su tale oggetto, viene richiamato il membro. Per i membri della proprietà, l'operatore restituisce il valore di tale proprietà. Per i membri del metodo, l'operatore chiama tale metodo sull'oggetto .

Quando si usa l'operatore di accesso ai membri in un oggetto raccolta di elenchi che non dispone del membro specificato, PowerShell enumera automaticamente gli elementi della raccolta e usa l'operatore di accesso ai membri in ogni elemento enumerato.

È possibile verificare se un oggetto è una raccolta di elenchi visualizzando se il tipo implementa l'interfaccia IList :

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

False

Durante l'enumerazione di accesso ai membri per una proprietà, l'operatore restituisce il valore della proprietà per ogni elemento con tale proprietà. Se non sono presenti elementi con la proprietà specificata, l'operatore restituisce $null.

Durante l'enumerazione di accesso ai membri per un metodo, l'operatore tenta di chiamare il metodo su ogni elemento della raccolta. Se un elemento della raccolta non dispone del metodo specificato, l'operatore restituisce l'eccezione MethodNotFound .

Avviso

Durante l'enumerazione di accesso ai membri per un metodo, il metodo viene chiamato su ogni elemento della raccolta. Se il metodo che si sta chiamando apporta modifiche, le modifiche vengono apportate per ogni elemento della raccolta. Se si verifica un errore durante l'enumerazione, il metodo viene chiamato solo sugli elementi enumerati prima dell'errore. Per maggiore sicurezza, è consigliabile enumerare manualmente gli elementi e gestire in modo esplicito eventuali errori.

Gli esempi seguenti illustrano in dettaglio il comportamento dell'operatore di accesso ai membri in tutti gli scenari possibili.

Accesso ai membri di un oggetto non elenco

Quando si utilizza l'operatore member-access su un oggetto che non è un insieme di elenchi e che ha il membro, il comando restituisce il valore della proprietà o dell'output del metodo per tale oggetto.

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

ABC

Quando si utilizza l'operatore di accesso ai membri in un oggetto non elenco che non dispone del membro, il comando restituisce $null se si specifica una proprietà o un errore MethodNotFound se si specifica un metodo.

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

Accesso ai membri di un oggetto insieme di elenchi

Quando si utilizza l'operatore di accesso ai membri in un oggetto raccolta con il membro, restituisce sempre il valore della proprietà o il risultato del metodo per l'oggetto raccolta.

Accesso ai membri presenti nella raccolta ma non ai relativi elementi

In questo esempio i membri specificati esistono nella raccolta, ma non gli elementi in esso contenuti.

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

a
b
c

Accesso ai membri esistenti nella raccolta e ai relativi elementi

Per questo esempio, i membri specificati esistono sia nella raccolta che negli elementi in esso contenuti. Confrontare i risultati dei comandi usando l'operatore member-access nella raccolta con i risultati dell'uso dell'operatore member-access sugli elementi della raccolta in ForEach-Object. Nell'insieme l'operatore restituisce il valore della proprietà o il risultato del metodo per l'oggetto raccolta e non gli elementi in esso contenuti.

[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

Nota

Le raccolte che implementano l'interfaccia System.Collections.IDictionary , ad esempio HashTable e OrderedDictionary, hanno un comportamento diverso. Quando si usa l'operatore di accesso ai membri in un dizionario con una chiave con lo stesso nome di una proprietà, restituisce il valore della chiave anziché quello della proprietà.

È possibile accedere al valore della proprietà dell'oggetto dizionario con il membro intrinseco psbase. Ad esempio, se il nome della chiave è keys e si vuole restituire la raccolta delle chiavi HashTable , usare questa sintassi:

$hashtable.PSBase.Keys

Accesso ai membri esistenti in tutti gli elementi di una raccolta, ma non su se stesso

Quando si usa l'operatore di accesso ai membri in un oggetto raccolta che non dispone del membro ma degli elementi in esso contenuti, PowerShell enumera gli elementi nell'insieme e restituisce il valore della proprietà o il risultato del metodo per ogni elemento.

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

A
B
C

Accesso ai membri presenti né nella raccolta né nei relativi elementi

Quando si utilizza l'operatore di accesso ai membri in un oggetto raccolta che non dispone del membro e non si eseguono né gli elementi in esso contenuti, il comando restituisce $null se si specifica una proprietà o un MethodNotFound errore se si specifica un metodo.

[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'.

Poiché l'oggetto raccolta non dispone del membro, PowerShell enumera gli elementi nella raccolta. Si noti che l'errore MethodNotFound specifica che System.String non contiene il metodo anziché System.Collections.Generic.List.

Accesso ai metodi esistenti solo in alcuni elementi di una raccolta

Quando si utilizza l'operatore di accesso ai membri per accedere a un metodo su un oggetto raccolta che non dispone del metodo e solo di alcuni elementi dell'insieme, il comando restituisce un MethodNotFound errore per il primo elemento dell'insieme che non dispone del metodo . Anche se il metodo viene chiamato su alcuni elementi, il comando restituisce solo l'errore.

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

Accesso alle proprietà esistenti solo in alcuni elementi di una raccolta

Quando si utilizza l'operatore di accesso ai membri per accedere a una proprietà di un oggetto raccolta che non dispone della proprietà e solo di alcuni elementi dell'insieme, il comando restituisce il valore della proprietà per ogni elemento dell'insieme con la proprietà .

$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

Vedi anche