about_Member-Access_Enumeration

Descripción breve

Describe la enumeración automática de elementos de colección de listas al usar el operador de acceso a miembros.

Descripción larga

A partir de PowerShell 3.0, la característica de enumeración de acceso a miembros mejora la comodidad de usar el operador de acceso a miembros (.) en los objetos de colección de listas. Cuando se usa el operador de acceso a 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 a miembros le ayuda a escribir código más sencillo y más corto. En lugar de canalización de un objeto de colección a ForEach-Object o mediante el ForEach()método intrínseco para tener acceso a los miembros de cada elemento de la colección, puede usar el operador de acceso a miembros en el objeto de colección.

Estos comandos son funcionalmente idénticos con el último que muestra el uso del operador de acceso a 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 usar el operador de acceso a miembros para obtener los valores de una propiedad en los elementos de una colección, pero no puede usarlo para establecerlos directamente. Para obtener más información, consulte about_Arrays.

Cuando se usa el operador de acceso a miembros en cualquier objeto y el miembro especificado existe en ese objeto, se invoca al miembro. Para los miembros de 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 se usa el operador de acceso a 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 a miembros en cada elemento enumerado.

Para comprobar si un objeto es una colección de listas, vea 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 miembro 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 a miembros de 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 a miembros de 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, solo se llama al método en los elementos enumerados antes del error. Para mayor seguridad, considere la posibilidad de enumerar manualmente los elementos y controlar explícitamente los errores.

En los ejemplos siguientes se detalla el comportamiento del operador de acceso a miembros en todos los escenarios posibles.

Acceso a los miembros de un objeto que no es de lista

Cuando se usa el operador de acceso a 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 salida del método para ese objeto.

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

ABC

Cuando se usa el operador de acceso a miembros en un objeto que no tiene el miembro , el comando devuelve $null si especifica una propiedad o un error MethodNotFound si 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'.

Obtener acceso a los miembros de un objeto de colección de listas

Cuando se usa el operador de acceso a 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.

Acceso a los miembros que existen en la colección, pero no a sus elementos

En este ejemplo, los miembros especificados existen en la colección, pero no en los elementos que contiene.

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

a
b
c

Acceso a los miembros que existen en la colección y sus elementos

En este ejemplo, los miembros especificados existen en la colección y en los elementos de él. Compare los resultados de los comandos mediante el operador de acceso a miembros de la colección con los resultados del uso del operador de acceso a miembros en los elementos de la colección de ForEach-Object. En la colección, el operador devuelve el valor de propiedad o el resultado del método para el objeto de colección y no los elementos de ella.

[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 se usa el operador de acceso a 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 tener acceso al valor de propiedad del objeto de diccionario con el miembro intrínseco psbase. Por ejemplo, si el nombre de clave es keys y desea devolver la colección de claves hashTable , use esta sintaxis:

$hashtable.PSBase.Keys

Acceso a miembros que existen en todos los elementos de una colección, pero no a sí mismo

Cuando se usa el operador de acceso a miembros en un objeto de colección que no tiene el miembro, sino los elementos que contiene, PowerShell enumera los elementos de la colección y devuelve el valor de 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

Acceso a miembros que existen en ni en la colección ni en sus elementos

Cuando se usa el operador de acceso a miembros en un objeto de colección que no tiene el miembro y tampoco los elementos en él, 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'.

Dado que el objeto de colección no tiene el miembro , PowerShell enumera 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.

Acceso a métodos que solo existen en algunos elementos de una colección

Cuando se usa el operador de acceso a miembros para tener acceso 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 MethodNotFound error para el primer 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'.

Acceso a propiedades que solo existen en algunos elementos de una colección

Cuando se usa el operador de acceso a miembros para tener acceso a una propiedad en un objeto de colección que no tiene la propiedad y solo algunos de los elementos de la colección lo 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

Consulte también