Compartir por


about_Arrays

Descripción breve

Describe las matrices, que son estructuras de datos diseñadas para almacenar colecciones de elementos.

Descripción larga

Una matriz es una estructura de datos diseñada para almacenar una colección de elementos. Los elementos pueden ser del mismo tipo o de tipos diferentes.

A partir de Windows PowerShell 3.0, una colección de cero o un objeto tiene algunas propiedades de matrices.

Creación e inicialización de una matriz

Para crear e inicializar una matriz, asigne varios valores a una variable. Los valores almacenados en la matriz se delimitan con una coma y se separan del nombre de la variable por el operador de asignación (=).

Por ejemplo, para crear una matriz denominada $A que contenga los siete valores numéricos (enteros) de 22, 5, 10, 8, 12, 9 y 80, escriba:

$A = 22,5,10,8,12,9,80

La coma también se puede usar para inicializar una sola matriz de elementos colocando la coma antes del único elemento.

Por ejemplo, para crear una sola matriz de elementos denominada $B que contenga el valor único de 7, escriba:

$B = ,7

También puede crear e inicializar una matriz mediante el operador range (..). En el ejemplo siguiente se crea una matriz que contiene los valores de 5 a 8.

$C = 5..8

Como resultado, $C contiene cuatro valores: 5, 6, 7 y 8.

Cuando no se especifica ningún tipo de datos, PowerShell crea cada matriz como una matriz de objetos (System.Object[]). Para determinar el tipo de datos de una matriz, use el método GetType(). Por ejemplo:

$A.GetType()

Para crear una matriz fuertemente tipada, es decir, una matriz que solo puede contener valores de un tipo determinado, convierta la variable como un tipo de matriz, como string[], long[], o int32[]. Para convertir una matriz, precede al nombre de la variable con un tipo de matriz entre corchetes. Por ejemplo:

[Int32[]]$ia = 1500, 2230, 3350, 4000

Como resultado, la matriz $ia solo puede contener enteros.

Puede crear matrices que se conviertan a cualquier tipo admitido en .NET. Por ejemplo, los objetos que Get-Process recuperan para representar los procesos son del tipo System.Diagnostics.Process. Para crear una matriz fuertemente tipada de objetos de proceso, escriba el siguiente comando:

[Diagnostics.Process[]]$zz = Get-Process

Operador de subexpresión de matriz

El operador de subexpresión de matriz crea una matriz a partir de las instrucciones que contiene. Sea cual sea la instrucción dentro del operador, el operador lo coloca en una matriz. Incluso si hay cero o un objeto.

La sintaxis del operador de matriz es la siguiente:

@( ... )

Puede usar el operador de matriz para crear una matriz de cero o un objeto. Por ejemplo:

$a = @("Hello World")
$a.Count
1
$b = @()
$b.Count
0

El operador de matriz es útil en scripts cuando se obtienen objetos, pero no sabe cuántos esperar. Por ejemplo:

$p = @(Get-Process Notepad)

Para obtener más información sobre el operador de subexpresión de matriz, vea about_Operators.

Acceso y uso de elementos de matriz

Lectura de una matriz

Puede hacer referencia a una matriz con su nombre de variable. Para mostrar todos los elementos de la matriz, invoque el nombre de la matriz. Por ejemplo, $a es una matriz de los números del 0 al 9:

$a
0
1
2
3
4
5
6
7
8
9

Puede hacer referencia a los elementos de una matriz mediante un índice. Incluya el número de índice entre corchetes. Los valores de índice comienzan en 0. Por ejemplo, para mostrar el primer elemento de la matriz $a, escriba:

$a[0]
0

Para mostrar el tercer elemento de la matriz $a, escriba:

$a[2]
2

Puede recuperar parte de la matriz mediante un operador de intervalo para el índice. Por ejemplo, para recuperar el segundo a quinto elemento de la matriz, escriba:

$a[1..4]
1
2
3
4

Los números negativos cuentan desde el final de la matriz. Por ejemplo, -1 hace referencia al último elemento de la matriz. Para mostrar los tres últimos elementos de la matriz, en orden ascendente de índice, escriba:

$a = 0 .. 9
$a[-3..-1]
7
8
9

Si escribe índices negativos en orden descendente, la salida cambia.

$a = 0 .. 9
$a[-1..-3]
9
8
7

Sin embargo, tenga cuidado al usar esta notación. La notación pasa del límite final al principio de la matriz.

$a = 0 .. 9
$a[2..-2]
2
1
0
9
8

Además, un error común es suponer que $a[0..-2] hace referencia a todos los elementos de la matriz, excepto por el último. Hace referencia a los elementos primero, último y segundo a último de la matriz.

Puede usar el operador más (+) para combinar intervalos con una lista de elementos de una matriz. Por ejemplo, para mostrar los elementos en las posiciones de índice 0, 2 y 4 a 6, escriba:

$a = 0 .. 9
$a[0,2+4..6]
0
2
4
5
6

Además, para enumerar varios rangos y elementos individuales, puede usar el operador más. Por ejemplo, para enumerar los elementos cero a dos, cuatro a seis y el elemento en el octavo tipo posicional:

$a = 0..9
$a[+0..2+4..6+8]
0
1
2
4
5
6
8

Iteraciones sobre elementos de matriz

También puede usar construcciones de bucle, como foreach, fory bucles while, para hacer referencia a los elementos de una matriz. Por ejemplo, para usar un bucle foreach para mostrar los elementos de la matriz $a, escriba:

$a = 0..9
foreach ($element in $a) {
  $element
}
0
1
2
3
4
5
6
7
8
9

El bucle foreach recorre en iteración la matriz y devuelve cada valor de la matriz hasta llegar al final de la matriz.

El bucle for resulta útil cuando se incrementan los contadores al examinar los elementos de una matriz. Por ejemplo, para usar un bucle for para devolver todos los demás valores de una matriz, escriba:

$a = 0..9
for ($i = 0; $i -le ($a.Length - 1); $i += 2) {
  $a[$i]
}
0
2
4
6
8

Puede usar un bucle while para mostrar los elementos de una matriz hasta que una condición definida ya no sea true. Por ejemplo, para mostrar los elementos de la matriz de $a mientras que el índice de matriz es inferior a 4, escriba:

$a = 0..9
$i=0
while($i -lt 4) {
  $a[$i]
  $i++
}
0
1
2
3

Propiedades de matrices

Count o Length o LongLength

En PowerShell, las matrices tienen tres propiedades que indican el número de elementos contenidos en la matriz.

  • Count: esta propiedad es la propiedad más usada para determinar el número de elementos de cualquier colección, no solo una matriz. Es un valor de tipo [int32]. En windows PowerShell 5.1 (y versiones anteriores) Count propiedad de alias para Length.

  • Length: esta propiedad es un valor de tipo [int32]. Contiene el mismo valor que Count.

    Nota

    Aunque Count y Length son equivalentes para matrices, Length pueden tener un significado diferente para otros tipos. Por ejemplo, Length para una cadena es el número de caracteres de la cadena. Pero la propiedad Count siempre es 1.

  • LongLength: esta propiedad es un valor de tipo [int64]. Use esta propiedad para matrices que contengan más de 2.147.483.647 elementos.

$a = 0..9
$a.Count
$a.Length
10
10

Rank

Devuelve el número de dimensiones de la matriz. La mayoría de las matrices de PowerShell solo tienen una dimensión. Incluso cuando cree que está creando una matriz multidimensional como en el ejemplo siguiente:

$a = @(
  @(0,1),
  @("b", "c"),
  @(Get-Process)
)

"`$a rank: $($a.Rank)"
"`$a length: $($a.Length)"
"`$a[2] length: $($a[2].Length)"
"Process `$a[2][1]: $($a[2][1].ProcessName)"

En este ejemplo, va a crear una matriz unidimensional que contiene otras matrices. Esto también se conoce como una matriz . La propiedad Rank demostró que es unidimensional. Para acceder a los elementos de una matriz escalonada, los índices deben estar entre corchetes independientes ([]).

$a rank: 1
$a length: 3
$a[2] length: 348
Process $a[2][1]: AcroRd32

Las matrices multidimensionales se almacenan en orden principal de fila. En el ejemplo siguiente se muestra cómo crear una matriz verdaderamente multidimensional.

[string[,]]$rank2 = [string[,]]::new(3,2)
$rank2.Rank
$rank2.Length
$rank2[0,0] = 'a'
$rank2[0,1] = 'b'
$rank2[1,0] = 'c'
$rank2[1,1] = 'd'
$rank2[2,0] = 'e'
$rank2[2,1] = 'f'
$rank2[1,1]
2
6
d

Para acceder a los elementos de una matriz multidimensional, separe los índices mediante una coma (,) dentro de un único conjunto de corchetes ([]).

Algunas operaciones en una matriz multidimensional, como la replicación y la concatenación, requieren que la matriz se aplane. La aplanación convierte la matriz en una matriz dimensional de tipo sin restricciones. La matriz resultante toma todos los elementos en orden de fila principal. Tenga en cuenta el ejemplo siguiente:

$a = "red",$true
$b = (New-Object 'int[,]' 2,2)
$b[0,0] = 10
$b[0,1] = 20
$b[1,0] = 30
$b[1,1] = 40
$c = $a + $b
$a.GetType().Name
$b.GetType().Name
$c.GetType().Name
$c

La salida muestra que $c es una matriz dimensional que contiene los elementos de $a y $b en orden principal de fila.

Object[]
Int32[,]
Object[]
red
True
10
20
30
40

Métodos de matrices

Clear

Establece todos los valores de elemento en el valor predeterminado del tipo de elemento de la matriz. El método Clear() no restablece el tamaño de la matriz.

En el ejemplo siguiente $a es una matriz de objetos .

$a = 1, 2, 3
$a.Clear()
$a | % { $null -eq $_ }
True
True
True

En este ejemplo, $intA se escribe explícitamente para contener enteros.

[int[]] $intA = 1, 2, 3
$intA.Clear()
$intA
0
0
0

ForEach()

Permite iterar en todos los elementos de la matriz y realizar una operación determinada para cada elemento de la matriz.

El método ForEach() tiene varias sobrecargas que realizan diferentes operaciones.

ForEach(scriptblock expression)
ForEach(scriptblock expression, object[] arguments)
ForEach(type convertToType)
ForEach(string propertyName)
ForEach(string propertyName, object[] newValue)
ForEach(string methodName)
ForEach(string methodName, object[] arguments)

PowerShell 7.6-preview.5 agregado PSForEach() como alias para el ForEach() método y PSWhere() como alias para el Where() método. Use estos alias para evitar conflictos con ForEach() y Where() que podrían definirse en la clase base del objeto. Por ejemplo, la System.Collections.Generic.List<T> clase define su propio ForEach() método. Use PSForEach() para evitar llamar al método de clase base.

ForEach(expresión scriptblock)

ForEach(expresión scriptblock, argumentos object[] )

Este método se agregó en PowerShell v4.

Nota

La sintaxis requiere el uso de un scriptblock. Los paréntesis son opcionales si el scriptblock es el único parámetro. Además, no debe haber un espacio entre el método y el paréntesis o llaves de apertura.

En el ejemplo siguiente se muestra cómo usar el método ForEach(). En este caso, la intención es generar el valor cuadrado de los elementos de la matriz.

$a = @(0 .. 3)
$a.ForEach({ $_ * $_})
0
1
4
9

Al igual que el parámetro ArgumentList de ForEach-Object, el arguments parámetro permite pasar una matriz de argumentos a un bloque de scripts configurado para aceptarlos.

Para obtener más información sobre el comportamiento de ArgumentList, vea about_Splatting.

ForEach(tipo convertToType)

El método ForEach() se puede usar para convertir los elementos en un tipo diferente; En el ejemplo siguiente se muestra cómo convertir una lista de fechas de cadena en [datetime] tipo.

("1/1/2017", "2/1/2017", "3/1/2017").ForEach([datetime])

Sunday, January 1, 2017 12:00:00 AM
Wednesday, February 1, 2017 12:00:00 AM
Wednesday, March 1, 2017 12:00:00 AM

ForEach(string propertyName)

ForEach(string propertyName, object[] newValue)

El método ForEach() también se puede usar para recuperar o establecer valores de propiedad para cada elemento de la colección.

# Set all LastAccessTime properties of files to the current date.
(dir 'C:\Temp').ForEach('LastAccessTime', (Get-Date))
# View the newly set LastAccessTime of all items, and find Unique entries.
(dir 'C:\Temp').ForEach('LastAccessTime') | Get-Unique
Wednesday, June 20, 2018 9:21:57 AM

ForEach(string methodName)

ForEach(argumentos methodName, object[] )

Por último, los métodos ForEach() se pueden usar para ejecutar un método en cada elemento de la colección.

("one", "two", "three").ForEach("ToUpper")
ONE
TWO
THREE

Al igual que el parámetro ArgumentList de ForEach-Object, el arguments parámetro permite pasar una matriz de valores a un bloque de scripts configurado para aceptarlos.

Nota

A partir de Windows PowerShell 3.0, la recuperación de propiedades y los métodos de ejecución para cada elemento de una colección también se puede realizar mediante "Métodos de objetos y colecciones escalares". Puede leer más sobre eso aquí about_Methods.

Where()

Permite filtrar o seleccionar los elementos de la matriz. El script debe evaluarse como cualquier cosa diferente de: cero (0), cadena vacía, $false o $null para que el elemento se muestre después del Where(). Para obtener más información sobre la evaluación booleana, vea about_Booleans.

Hay una definición para el método Where().

Where(scriptblock expression[, WhereOperatorSelectionMode mode
                            [, int numberToReturn]])

Nota

La sintaxis requiere el uso de un scriptblock. Los paréntesis son opcionales si el scriptblock es el único parámetro. Además, no debe haber un espacio entre el método y el paréntesis o llaves de apertura.

El Expression es un bloque de scripts necesario para el filtrado, el argumento opcional mode permite funcionalidades de selección adicionales y el argumento opcional numberToReturn permite limitar el número de elementos que se devuelven desde el filtro.

El valor de mode debe ser un WhereOperatorSelectionMode valor de enumeración:

  • Default (0): devuelve todos los elementos
  • First (1): devuelve el primer elemento
  • Last (2): devuelve el último elemento
  • SkipUntil (3) - Omitir elementos hasta que la condición sea true, devuelva todos los elementos restantes (incluido el primer elemento para el que la condición es true)
  • Until (4): devuelve todos los elementos hasta que se cumple la condición
  • Split (5): devuelve una matriz de dos elementos
    • El primer elemento contiene elementos coincidentes
    • El segundo elemento contiene los elementos restantes

En el ejemplo siguiente se muestra cómo seleccionar todos los números impares de la matriz.

(0..9).Where{ $_ % 2 }
1
3
5
7
9

En el ejemplo siguiente se muestra cómo seleccionar todas las cadenas no vacías.

('hi', '', 'there').Where{ $_ }
hi
there

PowerShell 7.6-preview.5 agregado PSForEach() como alias para el ForEach() método y PSWhere() como alias para el Where() método. Use estos alias para evitar conflictos con ForEach() y Where() que podrían definirse en la clase base del objeto. Por ejemplo, la System.Collections.Generic.List<T> clase define su propio ForEach() método. Use PSForEach() para evitar llamar al método de clase base.

Default

El modo Default filtra los elementos mediante el scriptblock de Expression.

Si se proporciona un numberToReturn, especifica el número máximo de elementos que se van a devolver.

# Get the zip files in the current users profile, sorted by LastAccessTime
$Zips = dir $Env:USERPROFILE -Recurse '*.zip' | Sort-Object LastAccessTime
# Get the least accessed file over 100MB
$Zips.Where({$_.Length -gt 100MB}, 'Default', 1)

Nota

Tanto el modo Default como el modo First devuelven los primeros elementos (numberToReturn) y se pueden usar indistintamente.

Last

$h = (Get-Date).AddHours(-1)
$logs = dir 'C:\' -Recurse '*.log' | Sort-Object CreationTime
# Find the last 5 log files created in the past hour
$logs.Where({$_.CreationTime -gt $h}, 'Last', 5)

SkipUntil

El SkipUntil modo omite todos los objetos de una colección hasta que un objeto pasa el filtro de expresión scriptblock. A continuación, devuelve ALL elementos de colección restantes sin probarlos. solo se prueba un elemento de paso.

Esto significa que la colección devuelta contiene pasar y elementos que NO se han probado.

El número de elementos devueltos se puede limitar pasando un valor al argumento numberToReturn.

$computers = "Server01", "Server02", "Server03", "localhost", "Server04"
# Find the first available online server.
$computers.Where({ Test-Connection $_ }, 'SkipUntil', 1)
localhost

Until

El modo Until invierte el modo SkipUntil. Devuelve TODOS los elementos de una colección hasta que un elemento pasa la expresión scriptblock. Una vez que un elemento pasa la expresión scriptblock, el método Where() detiene el procesamiento de elementos.

Esto significa que recibe el primer conjunto de elementos que no se pasan del método Where(). Después de se pasa un elemento, el resto se NO probado o devuelto.

El número de elementos devueltos se puede limitar pasando un valor al argumento numberToReturn.

# Retrieve the first set of numbers less than or equal to 10.
(1..50).Where({$_ -gt 10}, 'Until')
# This would perform the same operation.
(1..50).Where({$_ -le 10})
1
2
3
4
5
6
7
8
9
10

Nota

Tanto Until como SkipUntil funcionan bajo la premisa de NO probar un lote de elementos.

Until devuelve los elementos BEFORE el primer PASS. SkipUntil devuelve todos los elementos AFTER la primera pasar, incluido el primer elemento que pasa.

Split

El modo Split divide o agrupa los elementos de colección en dos colecciones independientes. Aquellos que pasan la expresión scriptblock y los que no lo hacen.

Si se especifica un numberToReturn, la primera colección contiene el pasar elementos, no superar el valor especificado.

Los objetos restantes, incluso aquellos que PASS el filtro de expresión, se devuelven en la segunda colección.

$running, $stopped = (Get-Service).Where({$_.Status -eq 'Running'}, 'Split')
$running
Status   Name               DisplayName
------   ----               -----------
Running  Appinfo            Application Information
Running  AudioEndpointBu... Windows Audio Endpoint Builder
Running  Audiosrv           Windows Audio
...
$stopped
Status   Name               DisplayName
------   ----               -----------
Stopped  AJRouter           AllJoyn Router Service
Stopped  ALG                Application Layer Gateway Service
Stopped  AppIDSvc           Application Identity
...

Nota

Los métodos ForEach() y Where() son miembros intrínsecos. Para obtener más información sobre los miembros intrínsecos, vea about_Intrinsic_Members.

Obtener los miembros de una matriz

Para obtener las propiedades y los métodos de una matriz, como la propiedad Length y el método SetValue, use el parámetro InputObject del cmdlet Get-Member.

Al canalizar una matriz a Get-Member, PowerShell envía los elementos uno a uno y Get-Member devuelve el tipo de cada elemento de la matriz (omidiendo duplicados).

Cuando se usa el parámetro InputObject, Get-Member devuelve los miembros de la matriz.

Por ejemplo, el comando siguiente obtiene los miembros de la variable de matriz $a.

Get-Member -InputObject $a

También puede obtener los miembros de una matriz escribiendo una coma (,) antes del valor que se canaliza al cmdlet Get-Member. La coma convierte la matriz en el segundo elemento de una matriz de matrices. PowerShell canaliza las matrices una a la vez y Get-Member devuelve los miembros de la matriz. Al igual que los dos ejemplos siguientes.

,$a | Get-Member

,(1,2,3) | Get-Member

Manipulación de una matriz

Puede cambiar los elementos de una matriz, agregar un elemento a una matriz y combinar los valores de dos matrices en una tercera matriz.

Para cambiar el valor de un elemento determinado en una matriz, especifique el nombre de la matriz y el índice del elemento que desea cambiar y, a continuación, use el operador de asignación (=) para especificar un nuevo valor para el elemento. Por ejemplo, para cambiar el valor del segundo elemento de la matriz $a (posición de índice 1) a 10, escriba:

$a[1] = 10

También puede usar el método SetValue de una matriz para cambiar un valor. En el ejemplo siguiente se cambia el segundo valor (posición de índice 1) de la matriz de $a a 500:

$a.SetValue(500,1)

Puede usar el operador += para agregar un elemento a una matriz. En el ejemplo siguiente se muestra cómo agregar un elemento a la matriz $a.

$a = @(0..4)
$a += 5

Nota

Cuando se usa el operador +=, PowerShell crea realmente una nueva matriz con los valores de la matriz original y el valor agregado. Esto puede provocar problemas de rendimiento si la operación se repite varias veces o el tamaño de la matriz es demasiado grande.

No es fácil eliminar elementos de una matriz, pero puede crear una nueva matriz que solo contenga elementos seleccionados de una matriz existente. Por ejemplo, para crear la matriz de $t con todos los elementos de la matriz $a, excepto para el valor en la posición de índice 2, escriba:

$t = $a[0,1 + 3..($a.Length - 1)]

Para combinar dos matrices en una sola matriz, use el operador más (+). En el ejemplo siguiente se crean dos matrices, se combinan y, a continuación, se muestra la matriz combinada resultante.

$x = 1,3
$y = 5,9
$z = $x + $y

Como resultado, la matriz $z contiene 1, 3, 5 y 9.

Para eliminar una matriz, asigne un valor de $null a la matriz. El siguiente comando elimina la matriz de la variable $a.

$a = $null

También puede usar el cmdlet Remove-Item, pero asignar un valor de $null es más rápido, especialmente para matrices grandes.

Matrices de cero o uno

A partir de Windows PowerShell 3.0, un tipo escalar y una colección de cero o uno de los objetos tiene las propiedades Count y Length. Además, puede usar la notación de índice de matriz para tener acceso al valor de un objeto escalar singleton. Esta característica le ayuda a evitar errores de scripting que se producen cuando un comando que espera una colección obtiene menos de dos elementos.

En el ejemplo siguiente se muestra que una variable que no contiene objetos tiene un Count y Length de 0.

PS> $a = $null
PS> $a.Count
0
PS> $a.Length
0

En el ejemplo siguiente se muestra que una variable que contiene un objeto tiene un Count y Length de 1. También puede usar la indexación de matrices para tener acceso al valor del objeto .

PS> $a = 4
PS> $a.Count
1
PS> $a.Length
1
PS> $a[0]
4
PS> $a[-1]
4

Al ejecutar un comando que podría devolver una colección o un único objeto, puede usar la indexación de matriz para tener acceso al valor del objeto sin tener que probar las propiedades Count o Length. Sin embargo, si el resultado es un único objeto (singleton) y ese objeto tiene una propiedad Count o Length, el valor de esas propiedades pertenece al objeto singleton y no representa el número de elementos de la colección.

En el ejemplo siguiente, el comando devuelve un único objeto de cadena. El Length de esa cadena es 4.

PS> $result = 'one','two','three','four' | Where-Object {$_ -like 'f*'}
PS> $result.GetType().FullName
System.String
PS> $result
four
PS> $result.Count
1
PS❯ $result.Length
4

Si desea que $result sea una matriz de cadenas, debe declarar la variable como una matriz.

En este ejemplo, $result es una matriz de cadenas. El Count y el Length de la matriz se 1y el Length del primer elemento es 4.

PS> [string[]]$result = 'one','two','three','four' |
    Where-Object {$_ -like 'f*'}
PS> $result.GetType().FullName
System.String[]
PS> $result
four
PS> $result.Count
1
PS> $result.Length
1
PS> $result[0].Length
4

Compatibilidad de indexación con System.Tuple Objetos

PowerShell 6.1 agregó la compatibilidad con el acceso indizado de objetos Tuple, similar a las matrices. Por ejemplo:

PS> $tuple = [Tuple]::Create(1, 'test')
PS> $tuple[0]
1
PS> $tuple[1]
test
PS> $tuple[0..1]
1
test
PS> $tuple[-1]
test

A diferencia de las matrices y otros objetos de colección, los objetos Tuple se tratan como un único objeto cuando se pasan a través de la canalización o por parámetros que admiten matrices de objetos.

Para obtener más información, consulte System.Tuple.

Indexación de tipos de .NET que implementan IDictionary<TKey, TValue>

PowerShell no llama al indexador true de un tipo para los tipos que implementan la interfaz genérica de IDictionary<TKey, TValue>. En su lugar, cuando se le asigna una clave, PowerShell comprueba la existencia de la clave mediante TryGetValue(), que devuelve $null cuando la clave no existe.

Por el contrario, si llama al indexador true del tipo mediante Item(<key>), el método produce una excepción cuando la clave no existe.

En el ejemplo siguiente se muestra la diferencia.

PS> [Collections.Generic.Dictionary[string, int]]::new()['nosuchkey']
# No output ($null)

PS> [Collections.Generic.Dictionary[string, int]]::new().Item('nosuchkey')
GetValueInvocationException: Exception getting "Item": "The given key
'nosuchkey' was not present in the dictionary."

Enumeración de acceso a miembros

A partir de PowerShell 3.0, cuando se usa el operador de acceso a miembros para acceder a un miembro que no existe en una colección de listas, PowerShell enumera automáticamente los elementos de la colección e intenta acceder al miembro especificado en cada elemento. Para obtener más información, vea about_Member-Access_Enumeration.

Ejemplos

En el ejemplo siguiente se crean dos nuevos archivos y se almacenan los objetos resultantes en la variable de matriz $files. Dado que el objeto de matriz no tiene el miembro LastWriteTime, se devuelve el valor de LastWriteTime para cada elemento de la matriz.

$files = (New-Item -Type File -Force '/temp/t1.txt'),
         (New-Item -Force -Type File '/temp/t2.txt')
$files.LastWriteTime
Friday, June 25, 2021 1:21:17 PM
Friday, June 25, 2021 1:21:17 PM

La enumeración de acceso a miembros permite obtener valores de elementos de una colección, pero no para establecer valores en elementos de una colección. Por ejemplo:

$files.LastWriteTime = (Get-Date).AddDays(-1)
InvalidOperation: The property 'LastWriteTime' cannot be found on this object.
Verify that the property exists and can be set.

Para establecer los valores, debe usar un método .

$files.set_LastWriteTime((Get-Date).AddDays(-1))
$files.LastWriteTime
Thursday, June 24, 2021 1:23:30 PM
Thursday, June 24, 2021 1:23:30 PM

El método set_LastWriteTime() es un miembro oculto del objeto FileInfo. En el ejemplo siguiente se muestra cómo buscar métodos deset ocultos.

$files | Get-Member -Force -Name set_*
   TypeName: System.IO.FileInfo

Name              MemberType Definition
----              ---------- ----------
Attributes        Property   System.IO.FileAttributes Attributes {get;set;}
CreationTime      Property   datetime CreationTime {get;set;}
CreationTimeUtc   Property   datetime CreationTimeUtc {get;set;}
IsReadOnly        Property   bool IsReadOnly {get;set;}
LastAccessTime    Property   datetime LastAccessTime {get;set;}
LastAccessTimeUtc Property   datetime LastAccessTimeUtc {get;set;}
LastWriteTime     Property   datetime LastWriteTime {get;set;}
LastWriteTimeUtc  Property   datetime LastWriteTimeUtc {get;set;}

Cautela

Dado que el método se ejecuta para cada elemento de la colección, se debe tener cuidado al llamar a métodos mediante la enumeración de miembros.

Consulte también