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 y, por lo tanto, son difíciles de evitar. Echemos un vistazo de cerca a los arrays y todo lo que tienen para ofrecer.
- Page Index
- ¿Qué es un array?,partido
- Todas -eq
- Array adición
- Plus es igual a +=
- Tubería de asignación
- Establecimiento inflexible de tipos de matrices
- ArrayList
- Genérico de la Lista
- Lista
- Remove()
- Más de colecciones
- Pre-tamaño de las matrices
- la Multiplicación de matrices
- Inicializa con 0
- matrices Anidadas
- Write-Output -NoEnumerate
- Devolver una matriz
¿qué es un array?
voy a empezar con una descripción técnica básica de lo que son los arrays y cómo son utilizados por la mayoría de los lenguajes de programación antes de cambiar a las otras formas en que PowerShell hace uso de ellos.
una matriz es una estructura de datos que sirve como una colección de múltiples elementos. Puede iterar sobre la matriz o acceder a elementos individuales mediante 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 con @()
Un array vacío puede ser creado usando @()
PS> $data = @() PS> $data.count 0
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.count 4 PS> $data Zero One Two Three
Esta matriz tiene 4 elementos. Cuando llamamos a la variable $data
, vemos la lista de nuestros elementos., Si es una matriz de cadenas, entonces tendremos una línea por cadena.
Podemos declarar una matriz en varias líneas. La coma es opcional en este caso y generalmente se omite.
$data = @( 'Zero' 'One' 'Two' 'Three' )
yo prefiero a declarar mi matrices en varias líneas, que. No solo es más fácil de leer cuando tiene varios elementos, sino que también hace que sea más fácil de comparar con versiones anteriores cuando se utiliza el control de código fuente.,
otra sintaxis
se entiende comúnmente que @()
es la sintaxis para crear una matriz, pero las listas separadas por comas funcionan la mayor parte del tiempo.
$data = 'Zero','One','Two','Three'
Write-Output para crear matrices
Un poco fría truco que vale la pena mencionar es que la puedes usar Write-Output
para crear rápidamente cadenas de caracteres en la consola.
$data = Write-Output Zero One Two Three
Esto es bueno porque usted no tiene que poner comillas alrededor de las cuerdas cuando el parámetro acepta cadenas., 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> $data Zero
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 elemento, necesitaríamos usar un desplazamiento de 1 para omitir el primer elemento.
PS> $data One
Esto significaría que el último elemento es en el desplazamiento 3.
PS> $data Three
Índice
Ahora usted puede ver por qué he escogido los valores que he hecho para este ejemplo. Introduje esto como un offset porque eso es lo que realmente es, pero este offset se conoce más comúnmente como un índice. Un í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 obtendrá 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> $data Zero Two Three
Los artículos deberán ser devueltos por el orden de los índices proporcionados. Si duplica un índice, obtendrá ese elemento ambas veces.,
PS> $data Three Zero Three
se puede especificar una secuencia de números con el construido en el ..
operador.
PS> $data One Two Three
Esto funciona a la inversa también.
PS> $data Three Two One
puede utilizar negitive los valores del índice de desplazamiento de la final. Por lo tanto, si necesita el último elemento de la lista, puede usar -1
.,
PS> $data Three
límites
En la mayoría de los idiomas, si intenta obtener acceso a un índice de un elemento que está más allá del final de la matriz, se obtiene algún tipo de error o una excepción. PowerShell no te dará nada en silencio.
PS> $null -eq $data True
No índice en un valor nulo de la matriz
Si la variable es de $null
e intenta índice como una matriz, usted recibirá un System.Management.Automation.RuntimeException
excepción con el mensaje de Cannot index into a null array
.,
PS> $empty = $null SP> $empty Error: 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.count 4
PowerShell 3.0 añadido un recuento de la propiedad a la mayoría de los objetos. puede tener un solo objeto y debe darle un recuento de 1
.,
PS> $date = Get-Date PS> $date.count 1
Aún $null
tiene un recuento de la propiedad, excepto que devuelve 0
.
PS> $null.count 0
Hay algunas trampas aquí que voy a volver cuando me tapa la comprobación de $null
o matrices vacías más adelante en este artículo.
off by one errors
se crea un error de programación común porque los arrays comienzan en el índice 0. Un error off by one se puede introducir de dos maneras muy comunes.,
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 elementos 4
y desea el último elemento, por lo que solo usará el tamaño para acceder al último elemento.
$data
PowerShell es perfectamente feliz de dejar de hacerlo y darle exactamente lo que existe un elemento en el índice 4, $null
. Debe usar $data.count - 1
o el -1
que aprendimos anteriormente.,
PS> $data Three
aquí es donde usted puede utilizar el -1
índice para obtener el último elemento.
PS> $data Three
Lee Dailey también me señaló que podemos usar $data.GetUpperBound(0)
para obtener el máximo número de índice.
PS> $data.GetUpperBound(0) Three
La segunda forma más común es cuando se itera la lista y no parar en el momento adecuado. Revisaré esto 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 para actualizar elementos individuales.
$data = 'dos' $data = 'tres'
Si tratamos de actualizar un elemento que está más allá del último elemento, a continuación, obtenemos un Index was outside the bounds of the array.
error.
revisaré esto más adelante cuando hable sobre cómo hacer un array más grande.
iteración
en algún momento, tendrá que 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 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, solo se sabe que se trata de la misma cosa como $_
. Puede usar cualquiera de los dos porque ambos representan el objeto actual en la canalización.,
bucle ForEach
el bucle ForEach
funciona bien con colecciones. Usando la sintaxis: foreach ( <variable> in <collection> )
foreach ( $node in $data ) { "Item: " }
método ForEach
tiendo a olvidar acerca de esto, pero funciona muy bien para las operaciones simples. PowerShell permite llamar a .ForEach()
en una colección.
PS> $data.foreach({"Item "}) Item Item Item Item
El .foreach()
tiene un parámetro que es un bloque de secuencia de comandos. Puede soltar los paréntesis y simplemente proporcionar el bloque de script.,
$data.foreach{"Item "}
Este es un menos conocido de la sintaxis, pero funciona de la misma manera. Este método foreach
se agregó 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, a menudo es 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 $index
debe 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 utilice un bucle for
, preste especial atención a la condición. Usé $index -lt $data.count
aquí. Es muy fácil obtener la condición ligeramente equivocada para obtener un apagado por un error en su lógica., El uso de $index -le $data.count
o $index -lt ($data.count - 1)
son siempre un poco mal. Eso causaría que su resultado procese demasiados o muy pocos elementos. Este es el clásico apagado por un error.
Switch loop
Este es uno que es muy fácil de pasar por alto. Si proporciona una matriz a una instrucción switch, coincidirá en cada elemento de la matriz.
$data = 'Zero','One','Two','Three' switch( $data ) { 'One' { 'Tock' } 'Three' { 'Tock' } Default { 'Tick' } }
Esto se producirá la siguiente salida:
Tick Tock Tick Tock
Hay un montón de cosas interesantes como esta 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 querrá actualizar los valores en la matriz a medida que los recorre. La mayoría de los bucles anteriores usan una variable en el bucle 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 les asigna a una variable.,
$processList = Get-Process
Todas las funciones básicas que ya hemos hablado todavía se aplican a matrices de objetos con un par de detalles que vale la pena destacar.
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> $data FirstName LastName ----- ---- Kevin Marquette
podemos acceder y actualizar directamente a las propiedades.,
PS> $data.FirstName Kevin PS> $data.FirstName = 'Jay' PS> $data FirstName LastName ----- ---- Jay Marquette
propiedades de Matriz
Normalmente, usted tendría que enumerar la totalidad de la lista como esta para tener acceso a todas las propiedades:
PS> $data | ForEach-Object {$_.LastName} Marquette Doe
O mediante el uso de la etiqueta Select-Object -ExpandProperty
cmdlet.
PS> $data | Select-Object -ExpandProperty LastName Marquette Doe
Pero PowerShell nos ofrece la posibilidad de solicitar LastName
directamente. PowerShell los enumerará todos y nos dará una lista limpia.,
PS> $data.LastName Marquette Doe
La enumeración que aún pasa, pero no vemos la complejidad detrás de él.
Where-Object filtering
Aquí es donde Where-Object
entra para que podamos filtrar y seleccionar lo que queremos de la matriz en función de las propiedades del objeto.
PS> $data | Where-Object {$_.FirstName -eq 'Kevin'} FirstName LastName ----- ---- Kevin Marquette
se puede escribir que la misma consulta como esta, 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 función fue añadida 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., Aquí está un ejemplo rápido:
foreach($person in $data) { $person.FirstName = 'Kevin' }
Este bucle es caminar cada objeto en el $data
array. Debido a que los objetos son tipos de referencia, la variable $person
hace referencia al mismo objeto que está en la matriz. Así que las actualizaciones de sus propiedades actualizarán 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 apunta al objeto original en la matriz., Esto no va a funcionar como se esperaría:
foreach($person in $data) { $person = @{ FirstName='Kevin' LastName='Marquette' } }
Operadores
Los operadores en PowerShell también trabajo en las matrices. Algunos de ellos funcionan de manera ligeramente diferente.
– join
el operador -join
es el más obvio, así que lo veremos primero. Me gusta el operador -join
y lo uso a menudo. Unirá todos los elementos de la matriz con un carácter o cadena que especifique.,
PS> $data = @(1,2,3,4) PS> $data -join '-' 1-2-3-4 PS> $data -join ',' 1,2,3,4
Una de las características por las que me gusta el -join
operador es el que se encarga de los elementos individuales.
PS> 1 -join '-' 1
yo uso esta dentro y registro detallado de mensajes.
PS> $data = @(1,2,3,4) PS> "Data is $($data -join ',')." Data is 1,2,3,4.
-únete a $array
Aquí es un truco que Lee Dailey señaló a mí., Si alguna vez quieren unir todo sin un delimitador, en vez de hacer esto:
PS> $data = @(1,2,3,4) PS> $data -join $null 1234
puede utilizar -join
con la matriz como parámetro con ningún prefijo. Echa un vistazo a este ejemplo para ver que estoy hablando.
PS> $data = @(1,2,3,4) PS> -join $data 1234
-reemplazar y -split
Los otros operadores como -replace
y -split
se va a ejecutar en cada elemento de la matriz. No puedo decir que alguna vez los haya 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-01 LAX-SQL-02 LAX-SQL-03
contiene
El -contains
operador permite comprobar una matriz de valores para ver si contiene un valor especificado.
PS> $data = @('red','green','blue') PS> $data -contains 'green' True
en
Cuando usted tiene un único valor que desea comprobar coincide con uno de varios valores, puede utilizar la etiqueta -in
operador. El valor estaría a la izquierda y la matriz en el lado derecho de la operación.,
PS> $data = @('red','green','blue') PS> 'green' -in $data True
Esto puede llegar a ser costosa si la lista es grande. A menudo utilizaré un patrón de expresiones regulares si estoy comprobando más de 4-5 valores.
PS> $data = @('red','green','blue') PS> $pattern = "^({0})$" -f ($data -join '|') PS> $pattern ^(red|green|blue)$ PS> 'green' -match $pattern True
-eq y -ne
la Igualdad y matrices puede ser complicado. Cuando la matriz está en el lado izquierdo, cada elemento se comparará. En lugar de devolver True
, devolverá el objeto que coincida.,
PS> $data = @('red','green','blue') PS> $data -eq 'green' green
Cuando se utiliza la etiqueta -ne
operador, vamos a obtener todos los valores que no son iguales a nuestro valor.
PS> $data = @('red','green','blue') PS> $data -ne 'green' red blue
Cuando se utiliza este en un if()
declaración, un valor que se devuelve es un True
valor. Si no se devuelve ningún valor, es un valor False
. Ambas instrucciones siguientes evaluarán a True
.,
$data = @('red','green','blue') if ( $data -eq 'green' ) { 'Green was found' } if ( $data -ne 'green' ) { 'And green was not found' }
voy a revisar esto en un momento en el que hablamos de la prueba de $null
.
-match
el operador-match
intentará 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-01 ATX-SQL-01
Cuando se utiliza la etiqueta -match
con un solo valor de una variable especial $Matches
rellena con la información de la partida. 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 llamado muchas maneras de 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 varios elementos 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 mejor práctica colocar el $null
en el lado izquierdo de la operadora. Esto hace que este escenario no sea un problema.
if ( $null -eq $array ) { 'Array actually is $null' }
$null
array no es la misma cosa como una matriz vacía. Si sabe que tiene una matriz, verifique el número de objetos en ella., Si la matriz es de $null
, el recuento será 0
.
if ( $array.count -gt 0 ) { 'Array is not empty' }
Hay una trampa más para ver fuera de aquí. Puede usar count
incluso si tiene un solo objeto, 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 usted todavía está en PowerShell 5.,1, puede envolver el objeto en una matriz antes de verificar el conteo para obtener un conteo preciso.
if ( @($array).count -gt 0 ) { 'Array is not empty' }
completamente De jugar a lo seguro, verificación de $null
, a continuación, comprobar el recuento.
if ( $null -ne $array -and @($array).count -gt 0 ) { 'Array is not empty' }
Todas -eq
hace poco vi que alguien pregunte cómo comprobar 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-Something if ( -not ( $results -ne 'Passed') ) { 'All results a Passed' }
Añadir a las matrices
En este punto, usted está comenzando a preguntarse cómo agregar elementos a una matriz. La respuesta rápida es que no se puede. Una matriz es un tamaño fijo en la memoria. Si usted necesita para crecer o agregar un solo elemento, entonces usted necesita para crear una nueva matriz y copiar todos los valores de la vieja matriz. Esto suena caro y como mucho trabajo, sin embargo, PowerShell oculta la complejidad de crear la nueva matriz.
Array addition
Podemos utilizar el operador addition with arrays para crear un nuevo array., Así que, dado que estas dos matrices:
$first = @( 'Zero' 'One' ) $second = @( 'Two' 'Three' )
podemos sumarlas para obtener una nueva matriz.
PS> $first + $second Zero One Two Three
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 se están 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. Será una matriz si contiene varios elementos.
$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 aprovechar la canalización con foreach()
sentencias y otros bucles. Así que en lugar de agregar elementos a una matriz en un bucle, podemos soltar elementos en la canalización.,
$array = foreach ( $node in (1..5)) { "ATX-SQL-$node" }
asignando los resultados delforeach
a una variable, capturamos todos los objetos y creamos una sola matriz.
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 una matriz que sea más rápida de trabajar. Actúa como una matriz de objetos en cada lugar que la necesitamos, pero maneja la adición de elementos 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 por defecto 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. Algunas llamadas a. net harán esto y pueden crear resultados inesperados.
si los únicos datos que tiene en su matriz son cadenas, también eche un vistazo a usar StringBuilder., Es casi lo mismo, pero tiene algunos métodos que son solo para tratar con cadenas. El StringBuilder
está especialmente diseñado para el rendimiento.
- concatenar cadenas usando StringBuilder
es muy 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 ArrayList
se depreció 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 especificará los tipos de datos que usará cuando se cree. Por lo tanto, 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()
Nos puede echar una matriz existente a una lista como esta sin crear el objeto en primer lugar:
$mylist = ]@(1,2,3)
podemos acortar la sintaxis un poco con la etiqueta using namespace
declaración en PowerShell 5 y posteriores. La instrucción using
debe ser la primera línea de su script. Al declarar un espacio de nombres, PowerShell le permitirá dejarlo fuera de los tipos de datos cuando haga 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
por lo que no tenemos que void
.
$myList.Add(10)
Y todavía podemos acceder a los elementos como otras matrices.,
PS> $myList 10
Lista
Usted puede tener una lista de cualquier tipo, pero cuando no se sabe el tipo de los objetos, puede usar ]
para que los contienen.
$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") Zero One Three
Cuando se trabaja con tipos de valor, se retire 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)
quitar El método devolverá 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á interesado en aprender más sobre estas opciones, eche un vistazo a esta esencia que Mark Kraus elaboró.
otros matices
ahora que he cubierto todas las funciones principales, aquí hay algunas cosas más que quería mencionar antes de terminar esto.
arrays Pre-dimensionados
he mencionado que no se puede cambiar el tamaño de un array una vez que se crea. Podemos crear una matriz de un tamaño predeterminado llamándola con el constructor new($size)
.,
$data = ]::new(4) $data.count 4
la Multiplicación de matrices
Un poco interesante truco es que usted puede multiplicar una matriz por un número entero.
PS> $data = @('red','green','blue') PS> $data * 3 red green blue red green blue red green blue
Inicializa con 0
Un escenario común es la que desea crear una matriz con ceros. Si solo vas a tener enteros, una matriz de enteros fuertemente tipeada por defecto será todos los ceros.
PS> ]::new(4) 0 0 0 0
podemos utilizar la multiplicación truco para hacer esto también.,
PS> $data = @(0) * 4 PS> $data 0 0 0 0
La cosa buena acerca de la multiplicación truco es que usted puede utilizar cualquier valor. Así que si prefieres tener 255
como valor predeterminado, esta sería una buena manera de hacerlo.
PS> $data = @(255) * 4 PS> $data 255 255 255 255
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 quepan en un patrón similar a una cuadrícula.
Aquí hay dos formas en que podemos crear una matriz de 2 dimensiones.,
$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 múltiples líneas 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 = 0 PS> $inside = 2 PS> $data 3
Añadir un conjunto de soporte para cada nivel de la matriz de anidación., 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 canalización, 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, se desenvuelve y Get-Member ve los miembros de la matriz y no la matriz real.,
PS> $data = @('red','green','blue') PS> $data | Get-Member TypeName: System.String ...
Para evitar que se desenvuelva de la matriz, puede usar Write-Object -NoEnumerate
.
PS> Write-Output -NoEnumerate $data | Get-Member TypeName: System.Object ...
tengo una segunda forma de hacer esto es más de un hack (y yo trato de evitar los hacks como este). Puede colocar una coma delante de la matriz antes de canalizarla.
PS> ,$data | Get-Member TypeName: System.Object ...
devuelve un array
Este desenredado de arrays también ocurre cuando se generan o devuelven valores desde una función., Todavía puede obtener una matriz si asigna la salida a una variable, por lo que esto no es un problema común.
el problema es que tendrá una nueva matriz. Si que es un problema, puede usar Write-Output -NoEnumerate $array
o return ,$array
para trabajar alrededor de ella.
¿Algo más?
sé que todo esto es mucho para asimilar. Mi esperanza es que aprenderás algo de este artículo cada vez que lo leas y que resultará ser una buena referencia para ti durante mucho tiempo., Si usted encontró esto para ser útil, por favor compártalo con otros que usted piensa que obtendrá valor de ella.
desde aquí, te recomiendo que eches un vistazo a un post similar que escribí sobre los hashtables.