muchas veces, al escribir scripts de PowerShell, necesita una forma de almacenar un conjunto de elementos. Una forma común de lograr esto es con un array o tipo específico conocido como ArrayList. Pero, ¿qué es una matriz de todos modos? Una matriz es una estructura de datos que está diseñada para almacenar una colección de elementos. Esto puede incluir los mismos y diferentes tipos de elementos.

los Arrays se utilizan en muchos lenguajes de programación diferentes y PowerShell no es diferente. Hay muchas maneras de crear, manipular y optimizar matrices., En este artículo aprenderá sobre ArrayLists, Arrays y colecciones, así como algunas prácticas recomendadas al aplicarlas con PowerShell.

tabla de contenidos

prerrequisitos/requisitos

dado que solo trabajará con el lenguaje de PowerShell en sí, no hay prerrequisitos ambientales. Solo necesita tener un PC con Windows con PowerShell. Más específicamente:

  • Windows PowerShell 3 o posterior
  • .NET Framework 4.5 o posterior

Quiero más consejos como este?, Echa un vistazo a mi blog personal de PowerShell en: https://nkasco.com/FriendsOfATA

crear matrices con PowerShell

hay muchas formas diferentes de crear matrices con PowerShell. Supongamos que tiene una lista de nombres que necesita procesar de alguna manera como se muestra a continuación.

JohnSusieJimJohnnyCarrie

construir matrices a través de elementos separados por comas

la forma más básica de crear una matriz es simplemente asignar entradas conocidas, separadas por comas, a una variable como se muestra a continuación.,

$BasicArray = "John", "Susie", "Jim", "Johnny", "Carrie"

Si ejecuta el método GetType() disponible en todos los objetos de PowerShell, verá que ha creado correctamente una matriz como se indica en la propiedad BaseType que se muestra a continuación.

PS51> $BasicArray.GetType()IsPublic IsSerial Name BaseType -------- -------- ---- -------- True True Object System.Array

con el operador de subexpresión

También puede crear matrices en PowerShell a través de un operador de subexpresión. Este concepto se usa comúnmente cuando no sabe cuántos elementos se agregarán a su matriz. El resultado puede contener cero, o muchos elementos cuando se crea.,

Aviso debajo de una matriz llamada $MyArray se ha creado con cero elementos dentro.

#Create an empty array with the sub-expression operatorPS51> $MyArray = @()PS51> $MyArray.count0

Usando el operador de rango

los Arrays no solo están relegados a almacenar cadenas como se muestra arriba. También puede crear matrices con otros tipos de objetos como enteros.

si necesita una matriz de enteros en orden secuencial, puede tomar un atajo y usar el operador range ... A continuación puede ver que se creó una matriz con los enteros del 2 al 5 con una sola línea de código.,

PS51> $NumberedArray = 2..5PS51> $NumberedArray2345

crear colecciones de ArrayList de PowerShell

usar una ArrayList de PowerShell también es una forma de almacenar una lista de elementos con PowerShell. La clase ArrayList es parte del Sistema.Colecciones espacio de nombres dentro de. NET. al crear un nuevo objeto de este tipo, puede almacenar objetos dentro de una ArrayList.

a continuación puede ver que necesita crear explícitamente un objeto ArrayList utilizando el cmdlet New-Object o fundiendo una matriz estándar en un objeto ArrayList.,

observe que en este caso el BaseType es un objeto, mientras que los ejemplos anteriores tienen tipos Base de matrices que exhiben herencia de la clase Object. En última instancia, PowerShell proporciona acceso al sistema de tipo.NET.

agregar elementos a una matriz

al crear una matriz, puede definir todos los elementos en el momento de la creación o agregarlos ad-hoc.

para agregar elementos a una colección existente, puede usar el operador += o el método Add. Pero sepa que hay grandes diferencias en la forma en que operan.,

Cuando crea una matriz estándar con @(), utilizará el operador += pero para agregar elementos a una lista de Arraylos, utilizará el método Add. Estos métodos difieren en que el operador += realmente destruye la matriz existente y crea una nueva con el nuevo elemento.

para demostrar, verá a continuación que puede hacer referencia a la propiedad IsFixedSize para una matriz o ArrayList para saber cuál es inmutable y cuál no.,

PS51> $BasicArray.IsFixedSizeTruePS51> $MyArrayList.IsFixedSizeFalse

dado que una matriz básica es una colección de tamaño fijo, no puede modificarla.

intentar usar el métodoAdd() con un array de tamaño fijo resultará en un error debido al tamaño fijo. A continuación puede ver algunos ejemplos en los que puede agregar elementos a una matriz con éxito.

#Does NOT work$BasicArray.Add("Nate")#Works$BasicArray += "Nate"$MyArrayList.Add("Nate")$MyArrayList += "Nate"

eliminar elementos de una matriz

ahora que tiene una mejor comprensión de cómo agregar elementos a una matriz, cubramos algunas formas en que puede eliminar elementos de una matriz.,

dado que un array básico es fijo, no puede eliminar elementos de ellos. En su lugar, tiene que crear una matriz completamente nueva. Por ejemplo, puede eliminar un solo elemento de una matriz creando una instrucción condicional que solo coincida con los elementos que desea incluir. A continuación se muestra un ejemplo.

$NewBasicArray = $BasicArray -ne "Nate"

dado que un ArrayList no es fijo, puede eliminar elementos de ellos utilizando el método Remove(). Este es un escenario en el que el uso de una ArrayList puede beneficiarlo si planea agregar/eliminar elementos con frecuencia.,

$MyArrayList.Remove("Nate")

Recuperar elementos específicos de una matriz o ArrayList

para recuperar elementos específicos de una matriz o ArrayList puede utilizar muchos métodos diferentes. Al igual que otros objetos de PowerShell, puede acceder a todos los elementos de una matriz simplemente llamando al objeto.

PS51> $BasicArrayJohnSusieJimJohnnyCarrie

quizás solo necesite recuperar el primer elemento, los arrays siempre tendrán un origen de 0 que representa el primer elemento del array. Para recuperar el primer elemento de una matriz, especifique el número de índice entre corchetes como se muestra a continuación.,

PS51> $BasicArrayJohn

por el contrario, también puede hacer referencia a los índices hacia atrás utilizando un guión (indicador negativo) para llamar al último X número de elementos de la matriz. Una forma común de encontrar el último elemento en un array es usando -1 como se muestra a continuación.

PS51> $BasicArrayCarrie

el operador de rango del que ha aprendido anteriormente también se puede usar para recuperar objetos de una matriz siguiendo el mismo método de llamar a los elementos. Supongamos que desea recuperar los primeros cuatro nombres en el array $BasicArray.,

puede ver a continuación puede especificar un rango de índices 0-3 que devolverá los primeros cuatro elementos.

PS51> $BasicArrayJohnSusieJimJohnny

optimización de matrices con PowerShell

ahora que tiene una buena base de cómo crear y manipular matrices, ¿cuál debe usar? Para responder a esto, veamos algunos ejemplos con el cmdlet Measure-Command. Con el cmdlet Measure-Command, comprenderá mejor cuánto tardan los comandos en procesar los elementos a medida que se pasan por la canalización.,

en términos generales, si tiene una pequeña colección de objetos, probablemente no notará mucha diferencia con la forma en que manipula sus matrices. Sin embargo, si tiene una gran colección de objetos, es importante comprender las diferencias para lograr resultados óptimos.

vamos a aplicar lo que acabas de aprender en la sección anterior sobre la diferencia entre += y usando el método Add() con un bucle de 50.000 elementos.

primero, cree un array vacío y una ArrayList vacía como se muestra a continuación.,

PS51> $MyArray = @()PS51> $MyArrayList = @()

a continuación, rellene 50.000 elementos en cada colección utilizando el operador de rango y un bucle foreach como se muestra a continuación.

@(0..50000).foreach({$MyArray += $_})@(0..50000).foreach({$MyArrayList.Add($_)})

finalmente, envuelva sus comandos en una expresión y pase esa expresión al cmdlet Measure-Command. Al ejecutar la expresión con Measure-Command, puede ver cuánto tiempo tarda realmente cada proceso en ejecutarse.

tenga en cuenta que como aprendió antes, += en realidad crea una nueva matriz en lugar de anexar a una fija.,

El resultado? ¡Casi 60 segundos contra 139 milisegundos!

como puede ver, es mucho más rápido aprovechar una ArrayList para colecciones grandes en lugar de usar una matriz de tamaño fijo.

si bien este es un ejemplo básico, enfatiza la importancia de comprender lo que su código está haciendo durante el procesamiento. Si no se entiende correctamente, puede resultar en una mala experiencia de usuario.,

Si tiene algún script existente que podría beneficiarse del uso de una ArrayList en lugar de una matriz, esto presentaría una fantástica oportunidad para hacer una mejora de la noche a la mañana!

Leer Más

  • la Comparación de las matrices con PowerShell
  • Cómo Crear Matrices para el Desempeño en PowerShell (MCPmag)

Quiero más consejos como este? Echa un vistazo a mi blog personal de PowerShell en: https://nkasco.com/FriendsOfATA.