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 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 variable por 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 intervalo (..). Por ejemplo, para crear e inicializar una matriz denominada "$B" que contiene los valores de 5 a 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, use 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, precede al 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 enteros.
Puede crear matrices que se conviertan en cualquier tipo admitido en Microsoft .NET Framework. Por ejemplo, los objetos que Get-Process recuperan para representar 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, incluso si contiene 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:
PS> $a = @("Hello World")
PS> $a.Count
1
PS> $b = @()
PS> $b.Count
0
El operador de matriz es especialmente útil en los scripts al obtener objetos, pero no sabe cuántos objetos obtendrá. 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 mediante su nombre de variable. Para mostrar todos los elementos de la matriz, escriba el nombre de la matriz. Por ejemplo, suponiendo $a
que es una matriz que contiene enteros 0, 1, 2, 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. Incluya el número de índice entre corchetes. Por ejemplo, para mostrar el primer elemento de la $a
matriz, 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 intervalo para el índice. Por ejemplo, para recuperar el segundo a quinto elemento de la matriz, debe escribir:
$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 asumir $a[0..-2]
que hace referencia a todos los elementos de la matriz, excepto al último. Hace referencia a los elementos primero, último y segundo a último de la matriz.
Puede usar el operador plus (+) 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 plus. Por ejemplo, para enumerar los elementos de 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 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 llegar al final de la matriz.
El bucle For es útil cuando se incrementan 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 verdadera. Por ejemplo, para mostrar los elementos de la $a
matriz mientras el índice de matriz es menor que 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
Para determinar cuántos elementos hay en una matriz, use 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á creando una matriz multidimensional; como en el ejemplo siguiente:
$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. Al igual que en el ejemplo siguiente:
[int[,]]$rank2 = [int[,]]::new(5,5)
$rank2.rank
2
Métodos de matrices
Borrar
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 $a
siguiente se muestra 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(type convertToType)
ForEach(string propertyName)
ForEach(string propertyName, object[] newValue)
ForEach(string methodName)
ForEach(string methodName, object[] arguments)
ForEach(scriptblock expression, object[] arguments)
ForEach(scriptblock expression)
ForEach(scriptblock expression, object[] arguments)
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 las versiones siguientes. Para versiones anteriores, use el método Pipelining para el cmdlet 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(type convertToType)
El ForEach
método se puede usar para convertir rápidamente los elementos en un tipo diferente; en el ejemplo siguiente se muestra cómo convertir una lista de fechas de cadena a [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 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, object[] arguments)
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 recuperar propiedades y ejecutar métodos para cada elemento de una colección también se puede realizar mediante "Métodos de objetos escalares y colecciones" 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 $false
vacía o $null
para que el elemento se muestre después de . Where
Hay una definición para el Where
método .
Where(scriptblock expression[, WhereOperatorSelectionMode mode
[, int numberToReturn]])
Expression
es scriptblock necesario para filtrar, el mode
argumento opcional permite funcionalidades de selección adicionales y el numberToReturn
argumento opcional permite limitar el número de elementos devueltos 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
Los siguientes modos de selección están disponibles.
Default
El Default
modo filtra los elementos mediante el Expression
scriptblock.
Si se proporciona , 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 como First
el Default
modo 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
El SkipUntil
modo 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 de paso
Esto significa que la colección devuelta contendrá elementos que no se han superado y 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
Until
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 detiene el Where
procesamiento de elementos.
Esto significa que recibirá el primer conjunto de elementos que no pasan del Where
método . Después de pasar un elemento, el resto NO se probará ni 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
Tanto como Until
SkipUntil
funcionan en el entorno local de NOT probando un lote de elementos.
Until
devuelve los elementos ANTES del primer paso.
SkipUntil
devuelve todos los elementos AFTER el primer paso, incluido el primer elemento que pasa.
Dividir
El Split
modo 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 , numberToReturn
la primera colección contendrá los elementos que pasan , no para superar el valor especificado.
Los objetos restantes, incluso aquellos que PASEn 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.
Cuando canaliza 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 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 convierte la matriz en 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. Al igual que los dos ejemplos siguientes.
,$a | Get-Member
,(1,2,3) | Get-Member
Manipular 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 $a
matriz (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 $a
matriz 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 $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 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 $t
matriz con todos los elementos de la $a
matriz, 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 $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