about_Member-Access_Enumeration
Description courte
Décrit l’énumération automatique des éléments de collection de listes lors de l’utilisation de l’opérateur d’accès aux membres.
Description longue
À compter de PowerShell 3.0, la fonctionnalité d’énumération d’accès membre améliore la commodité d’utilisation de l’opérateur d’accès membre (.
) sur les objets de collection de listes. Lorsque vous utilisez l’opérateur d’accès aux membres pour accéder à un membre qui n’existe pas sur une collection, PowerShell énumère automatiquement les éléments de la collection et tente d’accéder au membre spécifié sur chaque élément.
L’énumération d’accès aux membres vous aide à écrire du code plus simple et plus court. Au lieu d’acheminer un objet de collection vers ou à ForEach-Object
l’aide de la ForEach()
méthode intrinsèque pour accéder aux membres sur chaque élément de la collection, vous pouvez utiliser l’opérateur d’accès membre sur l’objet de collection.
Ces commandes sont fonctionnellement identiques à celles qui illustrent l’utilisation de l’opérateur d’accès membre :
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
Remarque
Vous pouvez utiliser l’opérateur d’accès membre pour obtenir les valeurs d’une propriété sur les éléments d’une collection, mais vous ne pouvez pas l’utiliser pour les définir directement. Pour plus d’informations, consultez about_Arrays.
Lorsque vous utilisez l’opérateur d’accès membre sur n’importe quel objet et que le membre spécifié existe sur cet objet, le membre est appelé. Pour les membres de propriété, l’opérateur retourne la valeur de cette propriété. Pour les membres de la méthode, l’opérateur appelle cette méthode sur l’objet.
Lorsque vous utilisez l’opérateur d’accès membre sur un objet de collection de listes qui n’a pas le membre spécifié, PowerShell énumère automatiquement les éléments de cette collection et utilise l’opérateur d’accès membre sur chaque élément énuméré.
Vous pouvez vérifier si un objet est une collection de listes en voyant si son type implémente l’interface IList :
$List = @('a', 'b')
$Hash = @{ a = 'b' }
$List.GetType().ImplementedInterfaces.Name -contains 'IList'
$Hash.GetType().ImplementedInterfaces.Name -contains 'IList'
True
False
Pendant l’énumération d’accès membre pour une propriété, l’opérateur retourne la valeur de la propriété pour chaque élément qui a cette propriété. Si aucun élément n’a la propriété spécifiée, l’opérateur retourne $null
.
Pendant l’énumération d’accès membre pour une méthode, l’opérateur tente d’appeler la méthode sur chaque élément de la collection. Si un élément de la collection n’a pas la méthode spécifiée, l’opérateur retourne l’exception MethodNotFound .
Avertissement
Pendant l’énumération d’accès membre pour une méthode, la méthode est appelée sur chaque élément de la collection. Si la méthode que vous appelez apporte des modifications, les modifications sont apportées pour chaque élément de la collection. Si une erreur se produit pendant l’énumération, la méthode est appelée uniquement sur les éléments énumérés avant l’erreur. Pour une sécurité supplémentaire, envisagez d’énumérer manuellement les éléments et de gérer explicitement les erreurs.
Les exemples suivants détaillent le comportement de l’opérateur d’accès membre dans tous les scénarios possibles.
Accès aux membres d’un objet non list
Lorsque vous utilisez l’opérateur d’accès membre sur un objet qui n’est pas une collection de listes et qui a le membre, la commande retourne la valeur de la propriété ou de la sortie de la méthode pour cet objet.
$MyString = 'abc'
$MyString.Length
$MyString.ToUpper()
3
ABC
Lorsque vous utilisez l’opérateur d’accès membre sur un objet non list qui n’a pas le membre, la commande retourne $null
si vous spécifiez une propriété ou une erreur MethodNotFound si vous spécifiez une méthode.
$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'.
Accès aux membres d’un objet de collection de listes
Lorsque vous utilisez l’opérateur d’accès membre sur un objet de collection qui a le membre, il retourne toujours la valeur de propriété ou le résultat de la méthode pour l’objet de collection.
Accès aux membres qui existent sur la collection, mais pas à ses éléments
Dans cet exemple, les membres spécifiés existent sur la collection, mais pas les éléments qu’il contient.
[System.Collections.Generic.List[string]]$Collection = @('a', 'b')
$Collection.IsReadOnly
$Collection.Add('c')
$Collection
False
a
b
c
Accès aux membres qui existent sur la collection et ses éléments
Pour cet exemple, les membres spécifiés existent à la fois sur la collection et les éléments qu’il contient. Comparez les résultats des commandes à l’aide de l’opérateur d’accès membre sur la collection aux résultats de l’utilisation de l’opérateur d’accès membre sur les éléments de collection dans ForEach-Object
. Sur la collection, l’opérateur retourne la valeur de propriété ou le résultat de la méthode pour l’objet de collection et non les éléments qu’il contient.
[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
Remarque
Les collections qui implémentent l’interface System.Collections.IDictionary , comme HashTable et OrderedDictionary, ont un comportement différent. Lorsque vous utilisez l’opérateur d’accès membre sur un dictionnaire qui a une clé portant le même nom qu’une propriété, elle retourne la valeur de la clé au lieu de celle de la propriété.
Vous pouvez accéder à la valeur de propriété de l’objet dictionnaire avec le membre intrinsèque psbase. Par exemple, si le nom de clé est keys
et que vous souhaitez retourner la collection des clés HashTable , utilisez cette syntaxe :
$hashtable.PSBase.Keys
Accès aux membres qui existent sur tous les éléments d’une collection, mais pas lui-même
Lorsque vous utilisez l’opérateur d’accès aux membres sur un objet de collection qui n’a pas le membre, mais les éléments qu’il contient, PowerShell énumère les éléments de la collection et retourne la valeur de propriété ou le résultat de la méthode pour chaque élément.
[System.Collections.Generic.List[string]]$Collection = @('a', 'b', 'c')
$Collection.Length
$Collection.ToUpper()
1
1
1
A
B
C
Accès aux membres qui n’existent ni sur la collection ni sur ses éléments
Lorsque vous utilisez l’opérateur d’accès membre sur un objet de collection qui n’a pas le membre et ni les éléments qu’il contient, la commande retourne $null
si vous spécifiez une propriété ou une MethodNotFound
erreur si vous spécifiez une méthode.
[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'.
Étant donné que l’objet collection n’a pas le membre, PowerShell a énuméré les éléments de la collection. Notez que l’erreur MethodNotFound spécifie que System.String ne contient pas la méthode au lieu de System.Collections.Generic.List.
Accès aux méthodes qui existent uniquement sur certains éléments d’une collection
Lorsque vous utilisez l’opérateur d’accès membre pour accéder à une méthode sur un objet de collection qui n’a pas la méthode et que seuls certains éléments de la collection l’ont, la commande retourne une MethodNotFound
erreur pour le premier élément de la collection qui n’a pas la méthode. Même si la méthode est appelée sur certains éléments, la commande retourne uniquement l’erreur.
@('a', 1, 'c').ToUpper()
InvalidOperation: Method invocation failed because [System.Int32] does not contain a method named 'ToUpper'.
Accès aux propriétés qui existent uniquement sur certains éléments d’une collection
Lorsque vous utilisez l’opérateur d’accès membre pour accéder à une propriété sur un objet de collection qui n’a pas la propriété et que seuls certains éléments de la collection l’ont, la commande retourne la valeur de propriété pour chaque élément de la collection qui a la propriété.
$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