sobre la enumeración de acceso de miembros
Breve descripción
Describe la enumeración automática de elementos de la colección de listas cuando se utiliza el operador de acceso de miembros.
Descripción larga
A partir de PowerShell 3.0, la característica enumeración de acceso de miembros mejora la conveniencia de usar el operador de acceso de miembros (.) en objetos de colección de listas. Cuando utiliza el operador de acceso de miembros para acceder a un miembro que no existe en una colección, PowerShell enumera automáticamente los elementos de la colección e intenta acceder al miembro especificado en cada elemento.
La enumeración de acceso de miembros le ayuda a escribir código más sencillo y breve. En lugar de canalizar un objeto de colección a ForEach-Object o usar el método intrínseco ForEach() para acceder a los miembros de cada elemento de la colección, puede usar el operador de acceso de miembros. en el objeto de colección.
Estos comandos son funcionalmente idénticos al último que demuestra el uso del operador de acceso de miembros:
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
Puede utilizar el operador de acceso de miembros para obtener los valores de una propiedad de los elementos de una colección, pero no puede utilizarlo para establecerlos directamente. Para obtener más información, consulte about_Arrays.
Cuando utiliza el operador de acceso de miembros en cualquier objeto y el miembro especificado existe en ese objeto, se invoca al miembro. Para los miembros de la propiedad, el operador devuelve el valor de esa propiedad. Para los miembros del método, el operador llama a ese método en el objeto.
Cuando usa el operador de acceso de miembros en un objeto de colección de listas que no tiene el miembro especificado, PowerShell enumera automáticamente los elementos de esa colección y usa el operador de acceso de miembros en cada elemento enumerado.
Puedes comprobar si un objeto es una colección de listas viendo si su tipo implementa la interfaz IList:
$List = @('a', 'b')
$Hash = @{ a = 'b' }
$List.GetType().ImplementedInterfaces.Name -contains 'IList'
$Hash.GetType().ImplementedInterfaces.Name -contains 'IList'
True
False
Durante la enumeración de acceso de miembros para una propiedad, el operador devuelve el valor de la propiedad para cada elemento que tiene esa propiedad. Si ningún elemento tiene la propiedad especificada, el operador devuelve $null.
Durante la enumeración de acceso de miembros para un método, el operador intenta llamar al método en cada elemento de la colección. Si algún elemento de la colección no tiene el método especificado, el operador devuelve la excepción MethodNotFound.
Advertencia
Durante la enumeración de acceso de miembros para un método, se llama al método en cada elemento de la colección. Si el método al que llama realiza cambios, los cambios se realizan para cada elemento de la colección. Si se produce un error durante la enumeración, el método se llama solo en los elementos enumerados antes del error. Para mayor seguridad, considere enumerar manualmente los elementos y manejar explícitamente cualquier error.
Los siguientes ejemplos detallan el comportamiento del operador de acceso de miembros en todos los escenarios posibles.
Acceder a miembros de un objeto que no está en la lista
Cuando utiliza el operador de acceso de miembros en un objeto que no es una colección de listas y que tiene el miembro, el comando devuelve el valor de la propiedad o la salida del método para ese objeto.
$MyString = 'abc'
$MyString.Length
$MyString.ToUpper()
3
ABC
Cuando utiliza el operador de acceso de miembros en un objeto que no pertenece a la lista y que no tiene el miembro, el comando devuelve $null si especifica una propiedad o un error MethodNotFound si usted especifica un método.
$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'.
Acceder a miembros de un objeto de colección de listas
Cuando utiliza el operador de acceso de miembros en un objeto de colección que tiene el miembro, siempre devuelve el valor de propiedad o el resultado del método para el objeto de colección.
Acceder a miembros que existen en la colección pero no en sus elementos
En este ejemplo, los miembros especificados existen en la colección pero no los elementos que contiene.
[System.Collections.Generic.List[string]]$Collection = @('a', 'b')
$Collection.IsReadOnly
$Collection.Add('c')
$Collection
False
a
b
c
Acceder a miembros que existen en la colección y sus elementos
Para este ejemplo, los miembros especificados existen tanto en la colección como en los elementos que contiene. Compare los resultados de los comandos que utilizan el operador de acceso de miembros en la colección con los resultados del uso del operador de acceso de miembros en los elementos de la colección en ForEach-Object. En la colección, el operador devuelve el valor de propiedad o el resultado del método para el objeto de la colección y no los elementos que contiene.
[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
Las colecciones que implementan la interfaz System.Collections.IDictionary, como HashTable y OrderedDictionary, tienen un comportamiento diferente. Cuando utiliza el operador de acceso de miembros en un diccionario que tiene una clave con el mismo nombre que una propiedad, devuelve el valor de la clave en lugar del de la propiedad.
Puede acceder al valor de propiedad del objeto de diccionario con el miembro intrínseco psbase. Por ejemplo, si el nombre de la clave es keys y desea devolver la colección de claves HashTable, utilice esta sintaxis:
$hashtable.PSBase.Keys
Acceder a miembros que existen en todos los elementos de una colección pero no en sí mismo
Cuando se utiliza el operador de acceso de miembros en un objeto de colección que no tiene el miembro pero los elementos que contiene, PowerShell enumera los elementos de la colección y devuelve el valor de la propiedad o el resultado del método para cada elemento.
[System.Collections.Generic.List[string]]$Collection = @('a', 'b', 'c')
$Collection.Length
$Collection.ToUpper()
1
1
1
A
B
C
Acceder a miembros que no existen ni en la colección ni en sus elementos
Cuando utiliza el operador de acceso de miembros en un objeto de colección que no tiene el miembro ni tampoco los elementos que contiene, el comando devuelve $null si especifica una propiedad o un MethodNotFound error si especifica un método.
[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'.
Como el objeto de la colección no tiene el miembro, PowerShell enumeró los elementos de la colección. Observe que el error MethodNotFound especifica que System.String no contiene el método en lugar de System.Collections.Generic.List.
Acceder a métodos que existen solo en algunos elementos de una colección
Cuando utiliza el operador de acceso de miembros para acceder a un método en un objeto de colección que no tiene el método y solo algunos de los elementos de la colección lo tienen, el comando devuelve un error MethodNotFound para la primera elemento de la colección que no tiene el método. Aunque se llama al método en algunos elementos, el comando solo devuelve el error.
@('a', 1, 'c').ToUpper()
InvalidOperation: Method invocation failed because [System.Int32] does not contain a method named 'ToUpper'.
Acceder a propiedades que existen solo en algunos elementos de una colección
Cuando utiliza el operador de acceso de miembros para acceder a una propiedad en un objeto de colección que no tiene la propiedad y solo algunos de los elementos de la colección la tienen, el comando devuelve el valor de propiedad para cada elemento de la colección que tiene la propiedad .
$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
Ver también
- acerca de_Arrays
- about_Intrinsic_Members
- acerca de_métodos
- acerca de_operadores
- acerca de_Propiedades