Articles

Guía de matrices de PowerShell: cómo usar y crear matrices

son una característica fundamental de PowerShell. Los Arrays permiten ingerir, manipular y generar estructuras de datos reales (y no solo cadenas sin procesar). Esta capacidad hace que PowerShell sea diferente y más útil que otros lenguajes de scripting.

en este artículo, explicaremos qué son las matrices y cómo utilizarlas en PowerShell. Primero le mostraremos cómo crear matrices en PowerShell y, a continuación, cómo usar funciones básicas para manipularlas., Luego veremos varios tipos diferentes de matrices y exploraremos algunas de las características más sutiles de ellas.

obtenga el curso de vídeo gratuito de PowerShell y Active Directory Essentials

lo recomendaría para usuarios nuevos y avanzados de PowerShell. Crear una herramienta publicitaria es una gran experiencia de aprendizaje.

nuestro objetivo es proporcionarle una buena base para trabajar con matrices en PowerShell. Una vez que haya dominado estos conceptos básicos, puede echar un vistazo a nuestro curso sobre PowerShell para obtener más información.,

  • Fundamentos del Array
  • Arrays of Objects
  • operadores para Arrays
  • Cómo agregar valores a un Array
  • Tipos de Array
  • Funciones avanzadas de Array

Arrays PowerShell

característica de casi todos los lenguajes de programación. Son una estructura de datos que sirve como una colección de múltiples piezas de datos. Al trabajar con una matriz, puede usar el mismo comando para realizar la misma función en cada elemento dentro de una matriz, o acceder y manipular elementos individuales usando un índice.,

Las matrices de PowerShell pueden contener uno o más elementos. Un elemento puede ser una cadena, un entero, un objeto o incluso otra matriz, y una matriz puede contener cualquier combinación de estos elementos. Cada uno de estos elementos tiene un índice, que siempre comienza (a veces confusamente) en 0. Así que el primer elemento en una matriz se da el índice 0, el segundo se indexa como 1, y así sucesivamente.,

Las matrices de PowerShell son una parte tan fundamental de PowerShell que aparecen en todos los tutoriales de PowerShell que existen, y un buen conocimiento de cómo trabajar con ellas es fundamental para muchos aspectos del uso de PowerShell, desde la configuración de Office 365 hasta el uso de PowerShell para Pentesting.

un ejemplo de una matriz de PowerShell

la forma más fácil de ilustrar lo que es una matriz es tomar un ejemplo. Hagamos una matriz que represente un tazón de fruta.,

Hay varias formas de crear matrices en Powershell, pero la más sencilla es ejecutar este comando:

@()

esto creará una matriz vacía. Sin embargo, una matriz vacía no es tan útil, así que agreguemos algunos frutos a nuestra nueva matriz. Estos se representarán como cadenas de texto. Para hacer eso, ejecute este comando

$fruit = @('Apples','Oranges','Bananas')

esto nombrará un array «fruit», y agregará tres elementos a él., Para ver que esto ha funcionado, puede leer la matriz de uso de este comando:

PS /Users/yourname> $fruit

Que ahora regreso:

 Apples Oranges Bananas

Como puede ver, esta matriz es un grupo de piezas individuales de datos. PowerShell los indexará automáticamente de la manera que hemos explicado anteriormente: «Apple» se indexará como 0, «Oranges» como 1 y «Bananas» como 2.

este ejemplo puede hacer que parezca que los arrays son objetos bastante simples, y de alguna manera lo son. Su simplicidad, sin embargo, es también lo que los hace tan flexibles, objetos poderosos., En el resto de esta guía, le daremos una idea de lo que puede hacer con los arrays.

Array Fundamentals

en esta sección, veremos las formas más básicas de crear y trabajar con matrices en PowerShell.

crear una matriz

primero, crearemos una matriz. La forma estándar de hacer esto es usar @ (), aunque hay otras formas.

Por ahora, vamos a crear una matriz llamada «data». Para hacer esto, ejecute:

$data = @()

Esta matriz está vacía en este momento porque no hemos especificado ningún dato para ella., Para comprobar cuántos elementos hay en un array, podemos usar la función count:

$data.count

que, por el momento, devolverá un 0, porque no hay elementos en nuestro array. Para hacer una matriz con algunos datos en ella, ponemos estos datos dentro de los paréntesis después de que @:

$data = @('Zero','One','Two','Three')

ejecute la misma función de conteo ahora, y verá que hay 4 elementos en esta matriz. Para ver estos elementos de nuevo, simplemente invocamos el array:

$data

que enumerará los elementos que ponemos en el array.,

acceder a los elementos

Ahora tenemos una matriz, vamos a querer acceder a los elementos de ella. Hay varias maneras de hacer esto. La primera es utilizar el índice de los elementos de la matriz. Como hemos dicho antes, los índices comienzan en 0, por lo que para recuperar el primer elemento de nuestra matriz tendremos que decirle a PowerShell que mire el elemento cuyo índice es cero. Lo hacemos ejecutando:

$data

esto devolverá «cero» porque esa fue la primera cadena que pusimos en nuestro array.,

también podemos extender esta sintaxis para devolver varios elementos de la misma matriz, simplemente poniendo más índices en el mismo comando. Por ejemplo, ejecutar:

$data

esto devolverá «cero dos tres». Los elementos se devuelven en el mismo orden en que ingresó los índices. También puede usar sintaxis adicional para devolver conjuntos de elementos de una matriz. Por ejemplo:

$data

devolverá todos los elementos con un índice entre 1 y 3 (inclusive)., Y:

$data

devolverá el último elemento de la matriz: el número negativo le dice a PowerShell que cuente hacia atrás desde el final de la matriz, por lo que en este caso, este comando devolverá «Three», el último elemento de nuestra matriz de prueba.

cambiar elementos

el mismo método se puede utilizar para actualizar los elementos en una matriz. Por ejemplo, para actualizar el elemento cuyo índice es 2 (recuerde que este es el tercer elemento del array), podemos ejecutar:

$data = 'second'

esto nos da acceso directo a los elementos dentro de un array.,

acciones iteradas

una de las características más potentes de PowerShell (y, de hecho, de cualquier interfaz de línea de comandos) es la capacidad de realizar la misma acción en todos los elementos de una matriz. Hay un número de diferentes maneras de hacer esto.

lo más básico es usar una canalización, que es el carácter |. Cuando pasa una matriz a una canalización, cada elemento de una matriz se procesa individualmente. Como hemos señalado en nuestro artículo sobre objetos de PowerShell y tuberías de datos, Esta es a menudo la forma más sencilla de realizar acciones iteradas.,

por ejemplo, para agregar una descripción a cada elemento de nuestra matriz, podemos usar este comando:

$data | ForEach-Object {"Item: "}

Este comando le dice a PowerShell que tome los elementos de data data uno a la vez, y luego para cada uno de ellos agregue «Item:» al principio, seguido del valor original.

Hay varias otras formas de realizar acciones iteradas en PowerShell, muchas de las cuales serán familiares si ha utilizado otros lenguajes de programación: PowerShell incluye bucles ForEach, bucles For y bucles Switch. Para obtener más información, consulte la documentación de Microsoft.,

Arrays of Objects

hasta ahora, hemos estado trabajando con un array que contiene datos básicos: una cadena. Sin embargo, las matrices también pueden contener objetos, y muchos de los usos más comunes de PowerShell, como configurar Office 365, requieren que sepa cómo trabajar con objetos. Así que echemos un vistazo a algunos comandos básicos para hacer eso.

creando una matriz de objetos

podemos crear una matriz de objetos de la misma manera que lo hicimos con cadenas, usando la función @ ()., Por ejemplo, para hacer una lista de prueba de empleados, podemos usar:

la mayoría de los cmdlets devolverán un array de este tipo cuando se les asigne una variable con la que trabajar.

acceder a objetos desde Arrays

el proceso que recorrimos anteriormente para acceder a piezas individuales de datos se puede usar igualmente con arrays que contienen objetos., Por ejemplo, ejecutar:

$data

devolverá:

 FirstName LastName ----- ---- Kevin Marquette

alternativamente, podemos acceder a las propiedades de objetos individuales especificando qué propiedad queremos dentro del mismo comando, así:

$data.FirstName

que devolverá «Kevin».

actualizar las propiedades de los objetos en los Arrays

yendo más allá, la misma sintaxis nos da la capacidad de actualizar las propiedades individuales dentro de los objetos que se mantienen en los arrays., Por ejemplo:

$data.FirstName = 'Jay'

actualizará la propiedad FirstName en el primer elemento de nuestro array a «Jay».

acceder a cada propiedad en una matriz de objetos

en la mayoría de los lenguajes de programación, tendríamos que usar un proceso iterativo (ver arriba) para acceder a todas las propiedades en una matriz de objetos. Podemos hacer eso también en PowerShell, por supuesto, ejecutando:

$data | ForEach-Object {$_.LastName}

esto devolverá una lista de todas las propiedades de LastName en nuestra matriz, pero es computacionalmente costoso y difícil escribir cada vez que desee ver estos datos., Por lo tanto, PowerShell tiene un acceso directo. Ejecutar esto:

$data.LastName

Y verá la misma lista. PowerShell está tomando cada objeto por turnos, como antes, pero nos oculta esta complejidad.

operadores para matrices

casi todos los operadores que usamos para elementos de datos individuales en PowerShell también funcionarán con matrices, pero algunos de ellos funcionan de manera un poco diferente cuando se usan de esta manera. Así que vamos a echar un vistazo a los operadores más comunes, y cómo se puede utilizar en matrices.,

-join

el operador-join es uno de los comandos más utilizados en PowerShell, y es extremadamente útil cuando se trabaja con matrices. Se puede usar iterativamente en los elementos de una matriz para unirlos en la salida de una matriz.

tomemos un ejemplo. Primero, cree una matriz simple:

$data = @(1,2,3,4)

y luego use-join para insertar un guion entre cada elemento, y arroje el resultado:

$data -join '-'

que devolverá»1-2-3-4″., El operador-join también se puede usar sin un delimitador, en el que los elementos de una matriz se mostrarán como una serie de valores no separados.

-contains

el operador-contains funciona en matrices de una manera muy similar a su uso con puntos de datos individuales. Puede usarlo para verificar si una matriz contiene una cadena en particular, y generará un valor booleano. Por ejemplo:

 PS> $data = @('red','green','blue') PS> $data -contains 'green' True

Equalities

hay dos operadores para comprobar la igualdad en PowerShell: -eq y-ne., Sin embargo, si está acostumbrado a usarlos en valores individuales, la forma en que funcionan en relación con los arrays puede parecer un poco extraña. Si usa-eq, por ejemplo, el operador no generará un «True» booleano, sino que devolverá el objeto que coincida.

Por ejemplo:

 PS> $data = @('red','green','blue') PS> $data -eq 'green' green

– ne operador funciona de la misma manera, excepto que no se dan todos los valores que no son iguales a su valor especificado., Por lo tanto:

 PS> $data = @('red','green','blue') PS> $data -ne 'green' red blue

Sin embargo, puede usar una instrucción if() para comparar la salida de estos operadores con su salida esperada, y devolver una salida «True» o «False».

Cómo agregar valores a una matriz

después de todas las instrucciones anteriores, probablemente se esté preguntando por qué hemos omitido agregar elementos de datos a una matriz. Eso es porque no hay forma de hacerlo. Una matriz, una vez creada, mantiene el mismo tamaño para siempre, por lo que para hacerla más grande necesita copiarla a una nueva matriz y eliminar la original.,

eso suena complicado, pero Powershell maneja este proceso por usted usando una serie de operadores bastante simples. Hay dos maneras principales de hacer esto.

adición de matrices

PowerShell puede agregar dos matrices juntas utilizando el operador»+», que oculta la complejidad de lo que el sistema está haciendo realmente. Por ejemplo, si crea dos matrices de prueba como esta:

 $first = @( 'Zero' 'One' ) $second = @( 'Two' 'Three' )

puede agregarlas juntas usando solo:

 PS> $first + $second

esto creará una nueva matriz con los cuatro valores y generará los resultados., Tenga en cuenta, sin embargo, que no le dará a este nuevo array un nuevo nombre. Para hacer eso, usamos el operador+=.

Plus es igual para combinar matrices

en lugar de usar el operador «+» en el ejemplo anterior, podríamos haber utilizado el operador»+=», que nos dará una matriz completamente nueva:

 $first += 'Two, Three'

el comando parece simple, pero oculta lo que PowerShell está haciendo aquí. Está copiando todos los valores de $first y creando una nueva matriz que incluya los valores adicionales. A continuación, elimina la matriz original.,

esto es algo problemático porque es computacionalmente caro. Con arreglos pequeños, es posible que no lo note, pero con grandes cantidades de Datos, este método puede bloquear rápidamente su sistema. Es por eso que le hemos dado una manera de evitar este problema, a continuación.

Tipos de Matriz

hasta ahora, hemos estado tratando con defecto matrices en PowerShell. Aunque PowerShell no nos lo dijo en ese momento, cada matriz que hemos creado hasta ahora es de un tipo, el tipo]. Este tipo de matriz puede contener cualquier tipo de valor de datos.,

matrices fuertemente tipeadas

Sin embargo, hay ocasiones en las que desea restringir los tipos de datos u objetos que una matriz puede contener a solo uno. Podemos hacer esto usando una matriz fuertemente tipada, que solo puede contener el tipo de datos especificado.

por ejemplo, para hacer una matriz que solo puede tomar enteros, podemos usar:

 PS> ] $numbers = 1,2,3

Si intenta poner el tipo incorrecto de valor de datos en una matriz fuertemente escrita, devolverá un código de error.

ArrayList

Como hemos dicho anteriormente, agregar elementos a los arrays puede ser una molestia., Sin embargo, hay un tipo diferente de colección – ArrayList – que maneja esto con más elegancia. Sin embargo, para usar este tipo de colección, tendremos que invocar.Net framework, que puede generar algunos resultados desafortunados en nuestro camino.

para crear una ArrayList y luego agregarle elementos, ejecute lo siguiente:

 $myarray = ::new() $myArray.Add('Value')

Aquí, podemos usar el constructor predeterminado de.Net para crear una nueva ArrayList, y luego usar el operador-Add para agregarle elementos. El operador está ahí porque a veces estos comandos arrojan salidas extrañas que pueden interferir con el código.,

yendo más allá

estos son los tipos de matriz más comunes en PowerShell, pero hay algunos otros. Si está desarrollando como usuario de PowerShell, es útil comenzar a usar ArrayLists en lugar de arrays directos, pero también debe tener en cuenta que este tipo de array no es utilizado por usuarios avanzados.

en su lugar, la mayoría de los codificadores experimentados usarán un tipo de Lista genérico llamado Lista. Este tipo de lista es un poco más compleja de usar porque se deriva directamente de C#, pero una vez que la has dominado, ofrece mucha más flexibilidad que las matrices que hemos discutido hasta ahora.,

Advanced Array Functions

Además de la funcionalidad básica que hemos cubierto hasta ahora, también hay una serie de funciones de matriz más avanzadas, y algunas características adicionales a tener en cuenta, a medida que comienza a usarlas con más frecuencia.

Arrays Pre-dimensionados

la forma estándar de crear arrays anterior creará un array con un tamaño determinado por el número de elementos en él. Sin embargo, puede crear una matriz de un tamaño especificado utilizando el constructor new (size size).

Puede hacer esto de la siguiente manera:

 $data = ]::new(4)

Si ejecuta a.,count query en esta matriz, devolverá «4», porque aunque no tenga datos en ella, llenará el espacio con 0. Esto es realmente extremadamente útil si necesita inicializar una nueva matriz que está llena de ceros porque una matriz de tamaño predeterminado se llenará inicialmente con 0.

multiplicar matrices

multiplicar los objetos en una matriz – y especialmente las cadenas – es algo que confunde a la mayoría de las personas cuando tienen que hacerlo por primera vez., Hemos visto scripts if() extremadamente complicados para lograr este resultado, pero hay una forma mucho más simple:

 PS> $data = @('red','green','blue') PS> $data * 3

Yep, eso es correcto. Esto creará una nueva matriz con cada valor repetido tres veces. También puede usar este comando como una forma alternativa de llenar una matriz con ceros (o cualquier otro valor predeterminado) creando una matriz con el valor elegido y multiplicándola tantas veces como desee.

Matrices Anidadas

al Igual que muchos otros lenguajes de programación, PowerShell admite matrices anidadas., La forma estándar de hacer esto en PowerShell es usar una matriz multidimensional. El ejemplo más simple de esto es crear una matriz bidimensional:

 $data = @(@(1,2,3),@(4,5,6),@(7,8,9)) $data2 = @( @(1,2,3), @(4,5,6), @(7,8,9) )

la estructura de datos que está creando con este comando es una matriz clásica, y se puede trabajar con ella como en otros lenguajes de programación. Por ejemplo, para acceder a un valor particular de esta matriz, deberá especificar dos dimensiones.,

por ejemplo, para acceder al valor «3», usaríamos esto:

 PS> $outside = 0 PS> $inside = 2 PS> $data 3

Este comando se puede usar para acceder a cualquier valor, pero necesita agregar corchetes anidados para entrar en cada nivel de la matriz.

una última palabra

todas las instrucciones anteriores pueden ser muchas para los usuarios que llegan por primera vez a PowerShell, pero se han elegido cuidadosamente como una forma de aprender el idioma. Al combinar las diversas técnicas, puede crear scripts potentes para automatizar muchos de los trabajos más frecuentes (y que consumen más tiempo) que realiza con PowerShell.,

estas habilidades también le ayudarán a ir más allá de PowerShell. Muchos de los lenguajes más comunes utilizados para gestionar la ciberseguridad, como NetCat y Nmap, utilizan muchos de los mismos principios que PowerShell. Por lo tanto, usar PowerShell para mejorar su ciberseguridad es una excelente manera de aprender a proteger sus sistemas de manera más general.