• 10/08/2020
  • 24 minutos de lectura
    • j
    • h
    • s
    • V

los arrays son una característica fundamental del lenguaje de la mayoría de los lenguajes de programación. Son una colección de valores u objetos que son difíciles de evitar. Echemos un vistazo de cerca a las matrices y todo lo que tienen que ofrecer.,

Nota

La versión original de este artículo apareció en el blog escrito por @KevinMarquette. El equipo de PowerShell agradece a Kevin por compartir este contenido con nosotros. Por favor, echa un vistazo a su blog atPowerShellExplained.com.

¿qué es un array?

voy a comenzar con una descripción técnica básica de qué son los arrays y cómo se usan en la mayoría de los lenguajes de programación antes de cambiar a las otras formas en que PowerShell los usa.

una matriz es una estructura de datos que sirve como una colección de múltiples elementos., Puede iterar sobre elarray o acceder a elementos individuales utilizando un índice. La matriz se crea como un fragmento secuencial de memoria donde cada valor se almacena justo al lado del otro.

voy a tocar cada uno de esos detalles a medida que avanzamos.

uso básico

dado que las matrices son una característica tan básica de PowerShell, existe una sintaxis sencilla para trabajar con ellas en PowerShell.,

Crear una matriz

Un array vacío puede ser creado usando @()

PS> $data = @()PS> $data.count0

podemos crear una matriz y de la semilla con valores sólo mediante la colocación de ellos en el @() paréntesis.

PS> $data = @('Zero','One','Two','Three')PS> $data.count4PS> $dataZeroOneTwoThree

Esta matriz tiene 4 elementos. Cuando llamamos a la variable $data, vemos la lista de nuestros elementos. Si es unarray de cadenas, entonces obtenemos una línea por cadena.

Podemos declarar una matriz en varias líneas. La coma es opcional en este caso y generalmente omitida.,

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

prefiero declarar mis matrices en varias líneas como esa. No solo es más fácil de leer cuando tienes varios elementos, también hace que sea más fácil de comparar con versiones anteriores cuando se utiliza sourcecontrol.

otra sintaxis

se entiende comúnmente que @() es la sintaxis para crear una matriz, pero las listas separadas por comas la mayor parte del tiempo.,

$data = 'Zero','One','Two','Three'

Salida de escritura para crear matrices

Un pequeño truco interesante que vale la pena mencionar es que puede usar Write-Output para crear rápidamente cadenas en la consola.

$data = Write-Output Zero One Two Three

esto es útil porque no tiene que poner comillas alrededor de las cadenas cuando el parámetro acepta strings. Nunca haría esto en un guión, pero es un juego justo en la consola.

acceder a elementos

ahora que tiene una matriz con elementos en ella, es posible que desee acceder y actualizar esos elementos.,

Offset

para acceder a elementos individuales, utilizamos los corchetes con un valor de offset que comienza en 0. Así es como obtenemos el primer elemento en nuestro array:

PS> $data = 'Zero','One','Two','Three'PS> $dataZero

la razón por la que usamos cero aquí es porque el primer elemento está al principio de la lista, por lo que usamos un desplazamiento de 0 elementos para llegar a él. Para llegar al segundo ítem, necesitaríamos usar un desplazamiento de 1 toskip al primer ítem.

PS> $dataOne

esto significaría que el último elemento está en el desplazamiento 3.,

PS> $dataThree

Index

Ahora puede ver por qué elegí los valores que hice para este ejemplo. Introduje esto como un offsetbecause que es lo que realmente es, pero este desplazamiento se refiere más comúnmente como un índice. Aníndice que comienza en 0. Para el resto de este artículo llamaré al offset un índice.

trucos especiales de índice

en la mayoría de los idiomas, solo puede especificar un solo número como índice y obtener un solo elemento de vuelta.PowerShell es mucho más flexible. Puede utilizar varios índices a la vez., Al proporcionar una lista de índices, podemos seleccionar varios elementos.

PS> $dataZeroTwoThree

los elementos se devuelven en función del orden de los índices proporcionados. Si duplicas un índice, obtienes ese elemento ambas veces.

PS> $dataThreeZeroThree

podemos especificar una secuencia de números con el operador incorporado ...

PS> $dataOneTwoThree

esto también funciona a la inversa.

PS> $dataThreeTwoOne

puede usar valores de índice negativos para desplazar desde el final. Por lo tanto,si necesita el último elemento de la lista, puede usar -1.,

PS> $dataThree

fuera de límites

en la mayoría de los idiomas, si intenta acceder a un índice de un elemento que está más allá del final de la matriz, obtendrá algún tipo de error o una excepción. PowerShell no devuelve nada en silencio.

PS> $null -eq $dataTrue

no puede indexar en una matriz nula

Si su variable es $null y trata de indexarla como una matriz, obtiene una excepciónSystem.Management.Automation.RuntimeException con el mensajeCannot index into a null array.,

PS> $empty = $nullSP> $emptyError: Cannot index into a null array.

Así que asegúrese de que sus matrices no son $null antes de intentar acceder a los elementos dentro de ellos.

Count

los Arrays y otras colecciones tienen una propiedad count que le indica cuántos elementos hay en el array.

PS> $data.count4

PowerShell 3.0 agregó una propiedad count a la mayoría de los objetos. puede tener un solo objeto y debe darle un recuento de 1.

PS> $date = Get-DatePS> $date.count1

Aún $null tiene un recuento de la propiedad, excepto que devuelve 0.,

PS> $null.count0

hay algunas trampas aquí que volveré a visitar cuando cubra la comprobación de $null o matrices vacías en este artículo.

errores desactivados por uno

se crea un error de programación común porque los arrays comienzan en el índice 0. Los errores Off-by-one se pueden introducir de dos maneras.

el primero es pensando mentalmente que desea el segundo elemento y utilizando un índice de 2 y realmente obtener el tercer elemento. O pensando que tiene cuatro elementos y desea el último elemento, por lo que utiliza el recuento para acceder al último elemento.,

$data

PowerShell se complace en permitirle hacer eso y darle exactamente qué elemento existe en el índice 4:$null. Deberías usar $data.count - 1 o el -1 que aprendimos anteriormente.

PS> $dataThree

aquí es donde usted puede utilizar el -1 índice para obtener el último elemento.

PS> $dataThree

Lee Dailey también me señaló que podemos usar$data.GetUpperBound(0) para obtener el número de índice máximo.,

PS> $data.GetUpperBound(0)3PS> $dataThree

La segunda forma más común es cuando se itera la lista y no se detiene en el momento adecuado. Lo visitaré cuando hablemos de usar el bucle for.

Updating items

podemos usar el mismo índice para actualizar los elementos existentes en el array. Esto nos da acceso directo toupdate artículos individuales.

$data = 'dos'$data = 'tres'

si intentamos actualizar un elemento que está más allá del último elemento, obtenemos un errorIndex was outside the bounds of the array..

revisaré esto más adelante cuando hable sobre cómo hacer un array más grande.,

iteración

en algún momento, es posible que deba recorrer o iterar toda la lista y realizar alguna acción para cada elemento de la matriz.

canalización

Las matrices y la canalización de PowerShell están pensadas entre sí. Esta es una de las formas más simples de procesar sobre esos valores. Cuando pasa una matriz a una canalización, cada elemento dentro de la matriz se procesa individualmente.

PS> $data = 'Zero','One','Two','Three'PS> $data | ForEach-Object {"Item: "}Item: Item: Item: Item: 

Si usted no ha visto $PSItem antes, sólo sé que es la misma cosa como $_., Puede usar eitherone porque ambos representan el objeto actual en la canalización.

bucle ForEach

el bucleForEach funciona bien con colecciones. Usando la sintaxis:foreach ( <variable> in <collection> )

foreach ( $node in $data ){ "Item: "}

ForEach method

tiendo a olvidarme de este pero funciona bien para operaciones simples. PowerShell le permite llamar .ForEach() en una colección.

PS> $data.foreach({"Item "})Item Item Item Item 

el .foreach() toma un parámetro que es un bloque de script., Puede soltar los paréntesis y simplemente proporcionar el bloque de script.

$data.foreach{"Item "}

Esta es una sintaxis menos conocida pero funciona igual. Este método foreach se añadió en PowerShell 4.0.

For loop

el buclefor se usa mucho en la mayoría de los otros idiomas, pero no se ve mucho en PowerShell. Cuando lo ves, es a menudo en el contexto de caminar una matriz.

for ( $index = 0; $index -lt $data.count; $index++){ "Item: " -f $data}

La primera cosa que hacemos es inicializar un $index a 0., Luego agregamos la condición de que $indexdebe ser menor que $data.count. Finalmente, especificamos que cada vez que loop que me debe aumentar el índice por 1. En este caso $index++ es la abreviatura de $index = $index + 1.

siempre que esté utilizando un bucle for, preste especial atención a la condición. Usé$index -lt $data.count aquí. Es fácil obtener la condición ligeramente equivocada para obtener un error off-by-oneerror en su lógica., El uso de $index -le $data.counto $index -lt ($data.count - 1) son siempre incorrectos. Eso causaría que su resultado procese demasiados o muy pocos elementos. Este es el error clásico apagado por uno.

Switch loop

Este es uno que es fácil de pasar por alto. Si proporciona una matriz a una instrucción switch, comprueba cada elemento de la matriz.

$data = 'Zero','One','Two','Three'switch( $data ){ 'One' { 'Tock' } 'Three' { 'Tock' } Default { 'Tick' }}
TickTockTickTock

Hay un montón de cosas interesantes que podemos hacer con la instrucción switch. Tengo otro artículo dedicado a esto.,

  • Todo lo que siempre quiso saber sobre la instrucción switch

Actualizar valores

Cuando su matriz es una colección de cadenas o enteros (tipos de valor), a veces puede querer actualizar los valores en la matriz a medida que los recorre. La mayoría de los bucles anteriores usan una variable en theloop que contiene una copia del valor. Si actualiza esa variable, el valor original de la matriz no se actualiza.

la excepción a esa instrucción es el bucle for., Si desea recorrer una matriz y actualizar los valores dentro de ella, entonces el bucle for es lo que está buscando.

for ( $index = 0; $index -lt $data.count; $index++ ){ $data = "Item: " -f $data}

Este ejemplo toma un valor por índice, hace algunos cambios y luego usa ese mismo índice para asignarlo de nuevo.

Arrays of Objects

hasta ahora, lo único que hemos colocado en un array es un tipo de valor, pero los arrays también pueden contener objetos.

$data = @( @{FirstName='Kevin';LastName='Marquette'} @{FirstName='John'; LastName='Doe'})

muchos cmdlets devuelven colecciones de objetos como matrices cuando se asignan a una variable.,

$processList = Get-Process

todas las características básicas de las que ya hemos hablado todavía se aplican a matrices de objetos con unos pocos detalles que vale la pena señalar.

acceder a propiedades

podemos usar un índice para acceder a un elemento individual de una colección al igual que con los tipos de valor.

PS> $dataFirstName LastName----- ----Kevin Marquette

podemos acceder y actualizar las propiedades directamente.,

PS> $data.FirstNameKevinPS> $data.FirstName = 'Jay'PS> $dataFirstName LastName----- ----Jay Marquette

Array properties

normalmente tendría que enumerar toda la lista de esta manera para acceder a todas las propiedades:

PS> $data | ForEach-Object {$_.LastName}MarquetteDoe

o mediante el cmdlet Select-Object -ExpandProperty.

PS> $data | Select-Object -ExpandProperty LastNameMarquetteDoe

Pero PowerShell nos ofrece la posibilidad de solicitar LastName directamente. PowerShell enumera themall para nosotros y devuelve una lista limpia.

PS> $data.LastNameMarquetteDoe

la enumeración sigue ocurriendo pero no vemos la complejidad detrás de ella.,

Where-Object filtering

Aquí es donde Where-Object entra para que podamos filtrar y seleccionar lo que queremos del arreglo basado en las propiedades del objeto.

PS> $data | Where-Object {$_.FirstName -eq 'Kevin'}FirstName LastName----- ----Kevin Marquette

se puede escribir la misma consulta para obtener el FirstName estamos buscando.

$data | Where FirstName -eq Kevin

Donde()

las Matrices tienen un Where() método que le permite especificar un scriptblock para el filtro.

$data.Where({$_.FirstName -eq 'Kevin'})

Esta característica se agregó en PowerShell 4.0.,

actualizando objetos en bucles

con tipos de valor, la única forma de actualizar la matriz es usar un bucle for porque necesitamos conocer el índice para reemplazar el valor. Tenemos más opciones con objetos porque son tipos de referencia. Este es un ejemplo rápido:

foreach($person in $data){ $person.FirstName = 'Kevin'}

Este bucle está recorriendo cada objeto en el array $data. Debido a que los objetos son tipos de referencia, la variable$person hace referencia al mismo objeto que está en la matriz. Por lo tanto, las actualizaciones de sus propiedades actualizan el original.,

todavía no se puede reemplazar todo el objeto de esta manera. Si intenta asignar un nuevo objeto a la variable$person, está actualizando la referencia de la variable a otra cosa que ya no apunte al objeto original en la matriz. Esto no funciona como cabría esperar:

foreach($person in $data){ $person = @{ FirstName='Kevin' LastName='Marquette' }}

Operadores

Los operadores de PowerShell también funcionan en matrices. Algunos de ellos funcionan de manera ligeramente diferente.

– join

el operador -join es el más obvio, así que vamos a verlo primero., Me gusta el operador -join y lo uso a menudo. Une todos los elementos de la matriz con el carácter o cadena que especifique.

PS> $data = @(1,2,3,4)PS> $data -join '-'1-2-3-4PS> $data -join ','1,2,3,4

una de las características que me gusta del operador -join es que maneja elementos individuales.

PS> 1 -join '-'1

uso esto dentro de los mensajes de registro y detallados.

PS> $data = @(1,2,3,4)PS> "Data is $($data -join ',')."Data is 1,2,3,4.

– join array array

Aquí hay un truco inteligente que Lee Dailey me señaló., Si alguna vez desea unir todo sin un delimitador, en lugar de hacer esto:

PS> $data = @(1,2,3,4)PS> $data -join $null1234

puede usar -join con el array como parámetro sin prefijo. Echa un vistazo a este ejemplo para ver que estoy hablando.

PS> $data = @(1,2,3,4)PS> -join $data1234

-reemplazar y -split

Los otros operadores como -replace y -split ejecutar en cada elemento de la matriz. No puedo decir que alguna vez los he usado de esta manera, pero aquí hay un ejemplo.,

PS> $data = @('ATX-SQL-01','ATX-SQL-02','ATX-SQL-03')PS> $data -replace 'ATX','LAX'LAX-SQL-01LAX-SQL-02LAX-SQL-03

-contiene

El -contains operador permite comprobar una matriz de valores para ver si contiene un specifiedvalue.

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

-en

Cuando tenga un solo valor que le gustaría verificar coincide con uno de varios valores, puede usar el operador -in. El valor estaría a la izquierda y el array a la derecha del operador.

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

esto puede resultar caro si la lista es grande. A menudo uso un patrón regex si estoy comprobando más thana pocos valores.,

PS> $data = @('red','green','blue')PS> $pattern = "^({0})$" -f ($data -join '|')PS> $pattern^(red|green|blue)$PS> 'green' -match $patternTrue

– eq and-ne

Equality and arrays can get complicated. Cuando la matriz está en el lado izquierdo, cada elemento se compara. En lugar de devolver True, devuelve el objeto que coincide.

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

cuando se utiliza el operador -ne, obtenemos todos los valores que no son iguales a nuestro valor.

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

Cuando se utiliza esto en una instrucciónif(), se devuelve un valorTrue., Si no se devuelve ningún valor, entonces es un valor False. Ambas sentencias siguientes evalúan a True.

$data = @('red','green','blue')if ( $data -eq 'green' ){ 'Green was found'}if ( $data -ne 'green' ){ 'And green was not found'}

revisaré esto en un momento en el que hablemos de probar $null.

-match

el operador-match intenta hacer coincidir cada elemento de la colección.

PS> $servers = @( 'LAX-SQL-01' 'LAX-API-01' 'ATX-SQL-01' 'ATX-API-01')PS> $servers -match 'SQL'LAX-SQL-01ATX-SQL-01

Cuando se utiliza la etiqueta -match con un solo valor de una variable especial $Matches rellena con matchinfo., Este no es el caso cuando una matriz se procesa de esta manera.

podemos tomar el mismo enfoque con Select-String.

$servers | Select-String SQL

me tome una mirada más cercana a Select-String,-match y el $matches variable en otro post denominada de muchas maneras para usar regex.

Testing null o empty

Testing for $null or empty arrays can be tricky. Aquí están las trampas comunes con matrices.

de un vistazo, esta declaración parece que debería funcionar.,

if ( $array -eq $null){ 'Array is $null'}

Pero yo sólo fui cómo -eq comprueba cada elemento de la matriz. Así que podemos tener una matriz de severalitems con un solo valor null null y evaluaría a $true

$array = @('one',$null,'three')if ( $array -eq $null){ 'I think Array is $null, but I would be wrong'}

por eso es una buena práctica colocar el $null en el lado izquierdo del operador. Esto hace que este escenario no sea un problema.

if ( $null -eq $array ){ 'Array actually is $null'}

a $null array no es lo mismo que un array vacío. Si sabe que tiene una matriz, compruebe elcontaje de objetos en ella., Si la matriz es de $null, el recuento es 0.

if ( $array.count -gt 0 ){ "Array isn't empty"}

Hay una trampa más para ver fuera de aquí. Puede usar count incluso si tiene un objeto único, a menos que ese objeto sea PSCustomObject. Se trata de un error corregido en PowerShell 6.1.Esa es una buena noticia, pero mucha gente todavía está en 5.1 y necesita tener cuidado con ella.

PS> $object = @{Name='TestObject'}PS> $object.count$null

si todavía está en PowerShell 5.1, puede envolver el objeto en una matriz antes de comprobar el recuento para obtener un recuento exacto.,

if ( @($array).count -gt 0 ){ "Array isn't empty"}

para jugar a lo seguro, verifique$null, luego verifique el conteo.

if ( $null -ne $array -and @($array).count -gt 0 ){ "Array isn't empty"}

All-eq

recientemente vi a alguien preguntar cómo verificar que cada valor en una matriz coincide con un valor dado.El usuario /u/bis de Reddit tenía esta solución inteligente que comprueba si hay valores incorrectos y luego voltea el resultado.

$results = Test-Somethingif ( -not ( $results -ne 'Passed') ){ 'All results a Passed'}

agregar a matrices

en este punto, está empezando a preguntarse cómo agregar elementos a una matriz. La respuesta rápida es que youcan’t. An array is a fixed size in memory., Si necesita ampliarlo o agregarle un solo elemento, entonces necesita crear una nueva matriz y copiar todos los valores de la matriz anterior. Esto suena como mucho trabajo, sin embargo, PowerShell oculta la complejidad de crear la nueva matriz. PowerShellimplements the addition operator (+) for arrays.

Nota

PowerShell no implementar una operación de resta. Si desea una alternativa flexible a anarray, debe usar un objeto genérico List.,

Array addition

podemos usar el operador addition con arrays para crear un nuevo array. Así que dados estos dos arrays:

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

podemos sumarlos para obtener un nuevo array.

PS> $first + $secondZeroOneTwoThree

Plus es igual a +=

podemos crear una nueva matriz en su lugar y agregar un elemento como este:

$data = @( 'Zero' 'One' 'Two' 'Three')$data += 'four'

recuerde que cada vez que utilice += que estás duplicando y la creación de una nueva matriz. Esto no es un problema para conjuntos de datos pequeños, pero escala extremadamente pobremente.,

asignación de canalización

puede asignar los resultados de cualquier Canalización a una variable. Es un array si contiene multipleitems.

$array = 1..5 | ForEach-Object { "ATX-SQL-$PSItem"}

normalmente cuando pensamos en usar la canalización, pensamos en los típicos one-liners de PowerShell. Podemos apalancar la canalización con instrucciones foreach() y otros bucles. Así que en lugar de agregar elementos a anarray en un bucle, podemos soltar elementos en la canalización.

$array = foreach ( $node in (1..5)){ "ATX-SQL-$node"}

tipos de matriz

de forma predeterminada, se crea una matriz en PowerShell como un tipo ]., Esto le permite contener cualquier tipo de objeto o valor. Esto funciona porque todo se hereda del tipo PSObject.

arrays fuertemente tipeados

Puede crear un array de cualquier tipo usando una sintaxis similar. Cuando se crea una matriz con un tipo Fuerte, solo puede contener valores u objetos del tipo especificado.

ArrayList

agregar elementos a un array es una de sus mayores limitaciones, pero hay algunas otras colecciones a las que podemos recurrir que resuelven este problema.,

el ArrayList es comúnmente una de las primeras cosas en las que pensamos cuando necesitamos un array con el que isfaster funcione. Actúa como un array de objetos en cada lugar que lo necesitamos, pero maneja addingitems rápidamente.

así es como creamos un ArrayList y le agregamos elementos.

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

Estamos llamando en .NET para obtener este tipo. En este caso, estamos usando el constructor predeterminado para crearlo. Luego llamamos al método Add para agregarle un elemento.,

la razón por la que estoy usando al principio de la línea es para suprimir el código devuelto. Some.NET las llamadas hacen esto y pueden crear resultados inesperados.

si los únicos datos que tiene en su matriz son cadenas, también eche un vistazo a usingStringBuilder. Es casi lo mismo, pero tiene algunos métodos que son solo para tratar con cuerdas. El StringBuilder está especialmente diseñado para el rendimiento.

es común ver a las personas moverse a ArrayList desde matrices. Pero viene de una época en la que C# no tenía soporte genérico., El ArrayListestá obsoleto en soporte para el genérico List

lista genérica

Un tipo genérico es un tipo especial en C# que define una clase generalizada y el usuario especifica los tipos de datos que utiliza cuando se crea. Entonces, si desea una lista de números o cadenas, definiría que desea una lista de tipos int o string.

Aquí se muestra cómo crear una lista para cadenas.

$mylist = ]::new()

O una lista de números.,

$mylist = ]::new()

podemos convertir una matriz existente en una lista como esta sin crear el objeto primero:

$mylist = ]@(1,2,3)

podemos acortar la sintaxis con la instrucción using namespace en PowerShell 5 y versiones posteriores. La instrucciónusing debe ser la primera línea de su script. Al declarar un espacio de nombres, PowerShelllets lo deja fuera de los tipos de datos cuando hace referencia a ellos.

using namespace System.Collections.Generic$myList = ]@(1,2,3)

Esto hace que el List mucho más utilizable.,

Tiene un método similarAdd disponible para usted. A diferencia de ArrayList, no hay valor de retorno en el método Add así que no tenemos que void.

$myList.Add(10)

Y todavía podemos acceder a los elementos como otras matrices.

PS> $myList10

List

puede tener una lista de cualquier tipo, pero cuando no conoce el tipo de objetos, puede usar] para contenerlos.,

$list = ]::new()

Remove()

El ArrayList y el genérico List tanto el apoyo de la eliminación de elementos de la colección.

using namespace System.Collections.Generic$myList = ]@('Zero','One','Two','Three')$myList.Remove("Two")ZeroOneThree

cuando se trabaja con tipos de valor, elimina el primero de la lista. Puede llamarlo una y otra vez para seguir eliminando ese valor. Si tiene tipos de referencia, debe proporcionar el objeto que desea eliminar.,

]$drives = Get-PSDrive$drives.remove($drives)
$delete = $drives$drives.remove($delete)

El método de quitar devuelve true si era capaz de encontrar y quitar el elemento de la colección.

más colecciones

hay muchas otras colecciones que se pueden utilizar, pero estos son los buenos reemplazos de matriz genérica.Si estás interesado en aprender más sobre estas opciones, echa un vistazo a esta lista que mark Kraus creó.

otros matices

ahora que he cubierto toda la funcionalidad principal, aquí hay algunas cosas más que quería tomention antes de terminar esto.,

arrays Pre-dimensionados

he mencionado que no se puede cambiar el tamaño de un array una vez que se ha creado. Podemos crear un array de un tamaño predeterminado llamándolo con el constructor new($size).

$data = ]::new(4)$data.count4

multiplicando arrays

Un pequeño truco interesante es que puede multiplicar un array por un entero.

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

Inicializa con 0

Un escenario común es la que desea crear una matriz con ceros. Si solo vas a haveintegers, un array fuertemente escrito de enteros por defecto a todos los ceros.,

PS> ]::new(4)0000

También podemos usar el truco de multiplicar para hacer esto.

PS> $data = @(0) * 4PS> $data0000

lo bueno del truco de multiplicar es que puedes usar cualquier valor. Así que si usted ratherhave 255 como su valor predeterminado, esta sería una buena manera de hacerlo.

PS> $data = @(255) * 4PS> $data255255255255

matrices Anidadas

Una matriz dentro de una matriz se denomina matriz anidada. No los Uso mucho en PowerShell, pero los he usado más en otros idiomas. Considere usar una matriz de matrices cuando sus datos encajen en un patrón similar a una cuadrícula.,

Aquí hay dos formas en que podemos 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 coma es muy importante en esos ejemplos. Di un ejemplo anterior de una matriz normal en líneas múltiples donde la coma era opcional. Ese no es el caso con una matriz multidimensional.

la forma en que usamos la notación de índice cambia ligeramente Ahora que tenemos una matriz anidada. Usando el$data anterior, así es como accederíamos al valor 3.

PS> $outside = 0PS> $inside = 2PS> $data3

agregue un conjunto de corchetes para cada nivel de anidamiento de matrices., El primer conjunto de corchetes es para la matriz más externa y luego trabaja su camino desde allí.

Write-Output-NoEnumerate

a PowerShell le gusta desenvolver o enumerar matrices. Este es un aspecto central de la forma en que PowerShell utiliza la línea, pero hay ocasiones en las que no desea que eso suceda.

normalmente Canalizo objetos aGet-Member para obtener más información sobre ellos. Cuando Canalizo una matriz a ella, itgets unwrapped y Get-Member ve los miembros de la matriz y no la matriz real.,

PS> $data = @('red','green','blue')PS> $data | Get-MemberTypeName: System.String...

Para evitar que se desenvuelva de la matriz, puede usar Write-Object -NoEnumerate.

PS> Write-Output -NoEnumerate $data | Get-MemberTypeName: System.Object...

Tengo una segunda forma que es más de un hack (y trato de evitar hacks como este). Puede colocar acomma delante de la matriz antes de canalizarla.

PS> ,$data | Get-MemberTypeName: System.Object...

devuelve un array

Este desenvolvimiento de arrays también ocurre cuando se generan o devuelven valores desde una función. Puede obtener una matriz si asigna la salida a una variable, por lo que esto no suele ser un problema.

el problema es que tiene una nueva matriz., Si que es un problema, puede usarWrite-Output -NoEnumerate $array o return ,$array para trabajar alrededor de ella.

¿Algo más?