Compartir a través de


Acerca de las matrices

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 artículos pueden ser del mismo tipo o de diferentes tipos.

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 mediante el operador de asignación (=).

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

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

También puede crear e inicializar una matriz mediante el operador de rango (..). Por ejemplo, para crear e inicializar una matriz denominada "$B" que contenga los valores del 5 al 8, escriba:

$B = 5..8

Como resultado, $B 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 (tipo: System.Object[]). Para determinar el tipo de datos de una matriz, utilice el método GetType(). Por ejemplo, para determinar el tipo de datos de la matriz de $a, escriba:

$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, preceda el nombre de la variable con un tipo de matriz entre corchetes. Por ejemplo, para crear una matriz de enteros de 32 bits denominada $ia que contenga cuatro enteros (1500, 2230, 3350 y 4000), escriba:

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

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

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

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

El operador de subexpresión de matriz

El operador de subexpresión de matriz crea una matriz, incluso si contiene cero o un objeto.

La sintaxis del operador de matriz es la siguiente:

@( ... )

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

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

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

$p = @(Get-Process Notepad)

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

Acceso y uso de elementos de matriz

Lectura de una matriz

Puede hacer referencia a una matriz utilizando su nombre de variable. Para mostrar todos los elementos de la matriz, escriba el nombre de la matriz. Por ejemplo, supongamos que $a es una matriz que contiene números enteros 0, 1, 2 y hasta 9; escriba:

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

Puede hacer referencia a los elementos de una matriz mediante un índice, empezando por la posición 0. Escriba el número de índice entre paréntesis. Por ejemplo, para mostrar el primer elemento de la matriz $a, escriba:

$a[0]
0

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

$a[2]
2

Puede recuperar parte de la matriz mediante un operador de rango para el índice. Por ejemplo, para recuperar los elementos segundo a quinto de la matriz, escribiría:

$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 alterna desde el límite final hasta el 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 utilizar el operador más (+) para combinar un intervalo 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 del cero al dos, del cuatro al seis y el elemento en el tipo de posición octava:

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

Iteraciones sobre elementos de matriz

También puede utilizar construcciones de bucle, como los bucles ForEach, For y While, para hacer referencia a los elementos de una matriz. Por ejemplo, para usar un bucle ForEach para mostrar los elementos de la $a matriz, 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 que llega al final de la matriz.

El bucle For es útil cuando se incrementan los contadores mientras se examinan 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 utilizar un bucle While para mostrar los elementos de una matriz hasta que una condición definida deje de ser verdadera. Por ejemplo, para mostrar los elementos de la $a matriz mientras el índice de la matriz es menor que 4, escriba:

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

Propiedades de las matrices

Count o Length o LongLength

Para determinar cuántos elementos hay en una matriz, utilice la Length propiedad o su Count alias. Longlength Es útil si la matriz contiene más de 2.147.483.647 elementos.

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

Rango

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á construyendo una matriz multidimensional; como el siguiente ejemplo:

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

[int]$r = $a.Rank
"`$a rank: $r"
$a rank: 1

La creación de una matriz verdaderamente multidimensional, en PowerShell, requiere la ayuda de .Net Framework. Como en el siguiente ejemplo:

[int[,]]$rank2 = [int[,]]::new(5,5)
$rank2.rank
2

Métodos de matrices

Claro

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

En el siguiente ejemplo $a hay 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 sobre 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 operaciones diferentes.

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

ForEach(expresión de bloque de script)

ForEach(expresión de bloque de script, argumentos object[])

Nota:

La sintaxis requiere el uso de un bloque de script. Los paréntesis son opcionales.

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.

Tenga en cuenta que este método se agregó en PowerShell v4 y no está disponible en versiones anteriores. Para versiones anteriores, use el método de canalización para el cmdlet de ForEach-Object

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

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

ForEach(tipo convertToType)

El ForEach método se puede usar para convertir rápidamente los elementos a un tipo diferente; el siguiente ejemplo 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(cadena propertyName)

ForEach(string propertyName, object[] newValue)

El ForEach método también se puede usar para recuperar rápidamente 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(string methodName, argumentos[] del objeto)

Por último, ForEach los métodos 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 -ArgumentList parámetro de ForEach-Object, el arguments parámetro permite pasar una matriz de argumentos a un bloque de script configurado para aceptarlos.

Nota:

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

Dónde

Permite filtrar o seleccionar los elementos de la matriz. El script debe evaluarse como algo diferente de: cero (0), cadena $false vacía o $null para que el elemento se muestre después de la etiqueta Where

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

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

El Expression es scriptque se requiere para el filtrado, el mode argumento opcional permite capacidades de selección adicionales y el numberToReturn argumento opcional permite la capacidad de limitar la cantidad de elementos que se devuelven desde el filtro.

Nota:

La sintaxis requiere el uso de un bloque de script. Los paréntesis son opcionales.

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

Están disponibles los siguientes modos de selección.

Predeterminado

El Default modo filtra los elementos mediante el Expression bloque de script.

Si se proporciona a numberToReturn , especifica el número máximo de artículos 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.

Último

$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 (Saltar)

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

Esto significa que la colección devuelta contendrá elementos que pasan y no pasan que NO se han probado.

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

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

Hasta

El Until modo invierte el SkipUntil modo. Devuelve TODOS los elementos de una colección hasta que un elemento pasa la expresión de bloque de script. Una vez que un elemento pasa la expresión scriptblock, el método deja de Where procesar los elementos.

Esto significa que recibirá el primer conjunto de elementos que no pasan del Where método. Después de que un artículo pase, el resto NO se probará ni se devolverá.

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

# 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:

Ambos Until y SkipUntil operan bajo la premisa de NO probar un lote de artículos.

Until devuelve los elementos ANTES de la primera pasada.

SkipUntil devuelve todos los elementos DESPUÉS del primer paso, incluido el primer elemento que pasa.

Divida

El Split modo divide o agrupa los elementos de la colección en dos colecciones separadas. Los que pasan la expresión scriptblock y los que no.

Si se especifica a numberToReturn , la primera colección contendrá los elementos que pasen , sin superar el valor especificado.

Los objetos restantes, incluso los que pasan el filtro de expresión, se devolverán 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
...

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 , PowerShell envía los elementos de uno en Get-Memberuno y Get-Member devuelve el tipo de cada elemento de la matriz (omitiendo los duplicados).

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

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

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 hace que la matriz sea el segundo elemento de una matriz de matrices. Windows PowerShell canaliza las matrices de una en una y Get-Member devuelve los miembros de la matriz. Como 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 de una matriz, especifique el nombre de la matriz y el índice del elemento que desea cambiar y, a continuación, utilice el operador de asignación (=) para especificar un nuevo valor para el elemento. Por ejemplo, para cambiar el valor del segundo elemento de la $a matriz (posición de índice 1) a 10, escriba:

$a[1] = 10

También puede utilizar 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 $a matriz a 500:

$a.SetValue(500,1)

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

$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 causar problemas de rendimiento si la operación se repite varias veces o si 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 contenga solo los elementos seleccionados de una matriz existente. Por ejemplo, para crear la $t matriz con todos los elementos de la $a matriz excepto 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, utilice 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 $z matriz 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 $a variable.

$a = $null

También puede usar el Remove-Item cmdlet, 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, una colección de cero o un objeto tiene la propiedad Count y Length. Además, puede indexar en una matriz de un objeto. 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 los ejemplos siguientes se muestra esta característica.

Cero objetos

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

Un objeto

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

Consulte también